0
  • 为什么在这个查询中,需要最后一个“WHERE”子句来限制重复项?
  • 第一个 LEFT JOIN 是将程序链接到 UID 上的实体
  • 第一个 INNER JOIN 是将程序链接到子查询,该子查询通过链接 UID 来获取这些程序的统计信息
  • 子查询(获取 StatsForDistributorClubs 子集)正在对 UID 列进行分组
  • 所以,我本以为无论如何这都会加入唯一记录,所以我们不应该得到重复行
  • 那么为什么需要通过确保“程序”链接到“实体”来基于最终的 WHERE 进行限制呢?

(为清楚起见,省略了查询的无关部分)

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 
      )
4

2 回答 2

1

如果您在外部查询中进行分组,则可能不需要额外的条件,但只会对您的内部查询进行分组。您对分组内部查询的 LEFT JOIN 仍然可能导致返回多条记录,因此您的任何 JOIN 都可能是罪魁祸首。

如果没有看到重复的样本,很难知道重复的来源,但是外部查询上的 GROUPING 肯定会删除完整的重复,或者修改后的 JOIN 标准可以解决它。

于 2013-06-20T04:01:45.623 回答
1

您在结果集中: SELECT LmiEntity.[DisplayName] ,StatsForDistributorClubs.*

我想你复制来自 LMIEntityProgram。

我的猜想:LMIEntityProgram - 是一个同时具有 LmiEntityId 和 ProgramId 的桥表,但您只能通过 ProgramId 加入。

如果您有多个 LmiEntityId 用于单个 ProgramId - 您必须有重复项。

这重复了您在 WHERE 中的过滤:

 [LMIEntityProgram].LMIEntityUid = LmiEntity.LmiEntityUid 

您可以在 JOIN 中执行此操作:

 LEFT JOIN LMIEntityProgram
    ON LMIEntityProgram.ProgramUid = Program.ProgramUid
        AND [LMIEntityProgram].LMIEntityUid = LmiEntity.LmiEntityUid    
于 2013-06-20T04:07:08.720 回答