2013-06-20 52 views
0
  • 为什么在这个查询中,最后一个'WHERE'子句需要限制重复?
  • 第一LEFT JOIN是连接方案,以实体上的UID
  • 第一内连接的连接方案,即获得这些程序统计子查询,通过在UID
  • 子查询链接(即获取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

如果你在你的外部查询分组,额外的标准可能不会是必要的,但只有你的内心查询分组。你的左连接到一个分组的内部查询仍然可能导致多个记录被返回,因为这个问题你的JOIN可能是罪魁祸首。

没有看到重复的样本,很难知道重复来自哪里,但外部查询上的GROUPING肯定会删除完整的重复项,或修改后的JOIN标准可以处理它。

+0

感谢 - 这是一个很好的点和收窄的原因。我会授予这个答案,因为期待任何人无法访问我无法提供的数据,这是不合理的,我无法提供 –

1

你必须在结果集: SELECT LmiEntity [显示名称] ,StatsForDistributorClubs *

我想你dublicates来自LMIEntityProgram。

我的猜想:LMIEntityProgram - 是LmiEntityId为ProgramId的桥表,但只能通过ProgramId加入。

如果您有多个LmiEntityId用于单个ProgramId - 您必须有dublicates。

这dublicates你在WHERE过滤:

[LMIEntityProgram].LMIEntityUid = LmiEntity.LmiEntityUid 

你可以做到这一点JOIN:

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

感谢Ingaz,但是我在ProgramUID上连接的不是ProgramId,所以应该只有一个唯一的'节目'记录。这不会是重复来自的地方。感谢您的建议 - 无论如何,我已经提出了您的建议,因为您的建议很容易出现 –

相关问题