2015-09-25 3 views
0

Я использую следующий CTE. Первая часть собирает всех уникальных людей, а вторая слева объединяет уникальных людей с событиями в течение определенного периода времени. Я ожидаю, что все строки будут возвращены из таблицы моих уникальных людей, даже если они не имеют события в течение периода времени. Но, похоже, это не так.Oracle Left Join не возвращает все строки

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 where, и я думал, что это заставляет проблему читать. – Jonnny

+0

Переключатель LEFT JOIN to RIGHT JOIN? – jarlh

ответ

1

Jonny

Проблема заключается в том Inthe колонке "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

Измените также «group by» и «order by» =) –

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 легче читать, чем несколько подзапросов. Таким образом, это не будет окончательный набор данных. Но я столкнулся с этой проблемой очень рано. Я буду возвращать 9-10 столбцов с итогами, средними и% s. Является ли CTE достойной идеей здесь или вы бы предложили другой метод? – Jonnny

+1

@Jonnny. , , CTE в порядке. Но вы должны суммировать 'people' с помощью' group by' и получать поля, которые вы хотите от этой таблицы. Думаю, я понимаю, почему вы делаете «левое соединение», но мне все еще неловко (и дополнительная работа будет влиять на производительность). –

+0

Спасибо за помощь :-) – Jonnny

Смежные вопросы