2013-06-20 1 views
0
  • 왜이 쿼리에서 중복을 제한하는 데 필요한 'WHERE'절이 마지막입니까?
  • 첫 번째 좌, UID를
  • 하위 쿼리에 연결하여
  • 제 1 내부는 이러한 프로그램에 대한 통계를 얻을 하위 쿼리에 프로그램을 연결되어 조인 UID에 엔티티 프로그램을 연결한다 JOIN (즉, StatsForDistributorClubs를 가져옵니다 하위 집합) UID 열 그룹화하고있다
  • 그럼,이 모든 것이 고유 한 레코드에 합쳐져 행 중복을 가져 오지 않아야한다고 생각했을 것입니다.
  • 그래서 최종 WHERE '프로그램'이 '실체'에 연결되도록 보장함으로써?

(명확성을 위해 생략 쿼리의 관련이없는 부분)SQL - 이미 그룹화 중일 때 행 복제본을 제거해야하는 이유는 무엇입니까?

SELECT LmiEntity.[DisplayName] 
     ,StatsForDistributorClubs.* 
FROM [Program] 
LEFT JOIN 
     LMIEntityProgram 
ON  LMIEntityProgram.ProgramUid = Program.ProgramUid 
INNER JOIN 
(
    SELECT e.LmiEntityUid, 
      sp.ProgramUid, 
      SUM(attendeecount) [Total attendance], 

     FROM LMIEntity e, 
       Timetable t, 
       TimetableOccurrence [to], 
       ScheduledProgramOccurrence spo, 
       ScheduledProgram sp 
     WHERE 
       t.LicenseeUid = e.lmientityUid 
     AND  [to].TimetableOccurrenceUid = spo.TimetableOccurrenceUid 
     AND  sp.ScheduledProgramUid = spo.ScheduledProgramUid 

     GROUP BY e.lmientityUid, sp.ProgramUid 
    ) AS StatsForDistributorClubs 
ON Program.ProgramUid = StatsForDistributorClubs.ProgramUid 
INNER JOIN LmiEntity 
ON LmiEntity.LmiEntityUid = StatsForDistributorClubs.LmiEntityUid 
LEFT OUTER JOIN Region 
ON Region.RegionId = LMIEntity.RegionId 
WHERE (
     [Program].LicenseeUid = LmiEntity.LmiEntityUid 
     OR 
     [LMIEntityProgram].LMIEntityUid = LmiEntity.LmiEntityUid 
    ) 

답변

1

당신이 당신의 외부 쿼리에 그룹화 된 경우는, 여분의 기준은 아마도 필요하지 않을 것입니다,하지만 당신의 내면의 쿼리가 그룹화됩니다. 그룹화 된 내부 쿼리에 대한 LEFT JOIN은 여전히 ​​여러 레코드가 반환 될 수 있습니다. 즉, JOIN이 원인 일 수 있습니다.

복제본 샘플을 보지 않아도 중복이 어디서 발생했는지 알기는 어렵지만 외부 쿼리의 GROUPING은 완전히 중복을 제거하거나 수정 된 JOIN 기준으로 처리 할 수 ​​있습니다.

+0

감사합니다 - 그 좋은 지적이고 원인을 좁혀. 이 질문에 답을 주겠다. 아무에게도 데이터에 대한 액세스가 없으면이를 정확히 지적 해 줄 것을 기대할 수는 없다. –

1

당신은 결과 집합에 있습니다. SELECT LmiEntity [표시 이름] , StatsForDistributorClubs *

난 당신이 LMIEntityProgram에서 오는 dublicates한다고 가정..

내 추측 : LMIEntityProgram - LmiEntityId와 ProgramId가 모두있는 브리지 테이블이지만 ProgramId에서만 가입합니다.

단일 ProgramId에 대해 여러 개의 LmiEntityId가있는 경우 - dublicates가 있어야합니다.

그리고 이것이 당신이 어디에서 필터링하고 dublicates :

[LMIEntityProgram].LMIEntityUid = LmiEntity.LmiEntityUid 

는 당신이 그것을 할 수는 가입 :

LEFT JOIN LMIEntityProgram 
    ON LMIEntityProgram.ProgramUid = Program.ProgramUid 
     AND [LMIEntityProgram].LMIEntityUid = LmiEntity.LmiEntityUid  
+0

Ingaz에게 감사의 말을 전한다. 그러나 ProgramIid가 아니라 ProgramUID에 연결되어있어 유일해야한다. '프로그램'기록. 이것은 중복 자료가 나오는 곳이 아닙니다. 의견을 보내 주셔서 감사합니다 - 어쨌든 당신의 제안이 쉽게 그럴 수 있었기 때문에 나는 당신을 upvoted했습니다 –