2012-12-11 37 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