2015-09-25 117 views
0

我正在使用以下CTE。第一部分收集所有獨特的人,第二部分在特定的時間框架內加入獨特的人與事件。我期望所有的行都會從我的唯一人員表中返回,即使他們在時間範圍內沒有事件。但這似乎並非如此。Oracle左連接不返回所有行

WITH DISTINCT_ATTENDING(ATTENDING) AS 
(
SELECT DISTINCT ATTENDING 
FROM PEOPLE 
WHERE ATTENDING IS NOT NULL 
), -- returns 62 records 
EVENT_HISTORY(ATTENDING, TOTAL) AS 
(
SELECT C.ATTENDING, 
     COUNT(C.ID) 
FROM DISTINCT_ATTENDING D 
LEFT JOIN PEOPLE C 
ON C.ATTENDING = D.ATTENDING 
AND TO_DATE(C.DATE, 'YYYYMMDD') < TO_DATE('20140101', 'YYYYMMDD') 

GROUP BY C.ATTENDING 
ORDER BY C.ATTENDING 

) 

SELECT * FROM EVENT_HISTORY; -- returns 49 rows 

我在這裏做錯了什麼?

+2

如果您刪除'AND TO_DATE(C.DATE,'YYYYMMDD')

+0

@vkp我得到62行返回。起初,我在那裏有一個where子句,並認爲這是導致問題的原因。 – Jonnny

+0

將LEFT JOIN切換到右連接? – jarlh

回答

1

強尼

的問題是在礦井列 「C.ATTENDING」,只是改變了 「D.ATTENDING」

SELECT D.ATTENDING, 
     COUNT(C.ID) 
FROM DISTINCT_ATTENDING D 
LEFT JOIN PEOPLE C 
ON C.ATTENDING = D.ATTENDING 
AND TO_DATE(C.DATE, 'YYYYMMDD') < TO_DATE('20140101', 'YYYYMMDD') 

GROUP BY D.ATTENDING 
ORDER BY D.ATTENDING 
+0

謝謝 - 從來沒有想過列,只是假設我正在構建連接不正確。 – Jonnny

+1

更改「羣」和「秩序」=) –

1

您的查詢顯得過於複雜。我認爲有以下做同樣的事情:

SELECT P.ATTENDING, 
     SUM(CASE WHEN TO_DATE(P.DATE, 'YYYYMMDD') < TO_DATE('20140101', 'YYYYMMDD') 
       THEN 1 ELSE 0 END) 
FROM PEOPLE P 
WHERE P.ATTENDING IS NOT NLL 
GROUP BY P.ATTENDING 
ORDER BY P.ATTENDING ; 

你的問題是,你被列在left join的聚集。當沒有匹配時,這是NULL

+0

謝謝戈登 - 我同意這個問題,我是你的答案的忠實粉絲:-)我正在建立幾個列到這個到最後輸出一個數據集。我發現CTE比多個子查詢更容易閱讀。所以它不會是返回的最終結束數據集。但是我很早就遇到了這個問題。我將以總計,平均數和%s返回9-10列。 CTE是一個不錯的想法,或者你會提出另一種方法嗎? – Jonnny

+1

@Jonnny。 。 。 CTE很好。但是,你應該使用'group by'來總結'people',並從那個表中獲得你想要的字段。我想我明白你爲什麼要做'左連接',但我仍然覺得很尷尬(而額外的工作會影響性能)。 –

+0

感謝您的幫助:-) – Jonnny