2012-12-11 35 views
0

设置我查询的结果是大约60K行:为什么要加入限制我的结果集?

SELECT f.client_id, 
     f.SECTION_A, 
     Month(f.received_date) Month, 
     Count(*)    Count 
FROM MILLENNIUM_DW_DEV..F_ACCESSION_DAILY f 
     LEFT JOIN salesdwh..TestPractices t 
     ON F.CLIENT_ID = t.ClientID 
WHERE t.ClientID IS NULL 
     AND Month(f.received_date) BETWEEN 1 AND 11 
     AND Year(f.received_date) = 2012 
GROUP BY f.SECTION_A, 
      Month(f.received_date), 
      f.client_id 

然而,当我加2左连接,它是将其限制在56K行!

SELECT f.client_id, 
     f.SECTION_A, 
     Month(f.received_date) Month, 
     Count(*)    Count, 
     s.SALES_REP_NAME, 
     s.REGION_NAME 
FROM MILLENNIUM_DW_DEV..F_ACCESSION_DAILY f 
     LEFT JOIN salesdwh..TestPractices t 
     ON F.CLIENT_ID = t.ClientID 
     LEFT JOIN MILLENNIUM_DW_DEV..D_CLIENT d 
     ON d.CLIENT_ID = f.CLIENT_ID 
     LEFT JOIN MILLENNIUM_DW_DEV..D_SALES_HIERARCHY s 
     ON s.SUB_TERRITORY_NBR = d.SUB_TERRITORY_NBR 
WHERE t.ClientID IS NULL 
     AND Month(f.received_date) BETWEEN 1 AND 11 
     AND Year(f.received_date) = 2012 
     AND d.REC_ACTIVE_FLG = 1 
     AND s.REC_ACTIVE_FLG = 1 
GROUP BY f.SECTION_A, 
      Month(f.received_date), 
      f.client_id, 
      s.SALES_REP_NAME, 
      s.REGION_NAME 

为什么我的左边加入LIMIT我的结果集?

回答

4

因此,解决方法是将条件添加到on条款,而不是where子句中:

FROM MILLENNIUM_DW_DEV..F_ACCESSION_DAILY f 
     LEFT JOIN salesdwh..TestPractices t 
     ON F.CLIENT_ID = t.ClientID 
     LEFT JOIN MILLENNIUM_DW_DEV..D_CLIENT d 
     ON d.CLIENT_ID = f.CLIENT_ID and d.REC_ACTIVE_FLAG = 1 
     LEFT JOIN MILLENNIUM_DW_DEV..D_SALES_HIERARCHY s 
     ON s.SUB_TERRITORY_NBR = d.SUB_TERRITORY_NBR and s.REC_ACTIVE_FLAG = 1 
+0

哇!我不知道你可以做到这一点! –

+0

做我的方式和你的方式之间的差异是什么?结果如何不同? –

+1

当你把条件拉到你拿走左边的地方 – Paparazzi

4

你不只是添加左外连接,您还增加过滤条件:

and d.REC_ACTIVE_FLG=1 
and s.REC_ACTIVE_FLG=1 

这有效地将您的外部连接到内部连接。它也可能会过滤出一些记录,其中d和/或s存在,但REC_ACTIVE_FLG不等于1

+1

将是更好的解释,这将使左侧连接的工作原理类似内部连接。 –

+0

@PhilipiWillemann:很好,谢谢。 – NPE