2014-10-27 3 views
0

Я новичок в sql и работаю над несколькими запросами.using union with join sql

Я пытаюсь использовать союз и объединяться.

Он работает иначе, если я не выводим номер 0.

Если кто-то может вести меня, где я неправильно.

SELECT m.movie_title, m.release_year,COUNT(c.actor_name) female_actors 
GROUP BY m.movie_title, m.release_year 
UNION 
SELECT COUNT(c2.actor_name), 0 
+0

Какая СУБД? И см. COALESCE – Strawberry

+0

Я использую sql (не знаю, какие СУБД), используя oracle11g (если это помогает). Посмотрел на COALESCE, и я все еще новичок. Хочешь придерживаться основ, прежде чем я пойду вперед. Однако, спасибо. – Maddy

+0

Почему вы включаете ненужные теги? -1 – Strawberry

ответ

1

Вы должны внешнее соединение АКТЕР тоже. Внутреннее соединение удаляет все внешние соединения CAST_MEMBER, потому что, конечно, нет действующего лица для несуществующего CAST_MEMBER. Это все, что нужно сделать.

SELECT m.movie_title, m.release_year, COUNT(c.actor_name) female_actors 
FROM MOVIE m 
LEFT JOIN CAST_MEMBER c on (m.movie_title = c.movie_title AND m.release_year = c.release_year) 
LEFT JOIN ACTOR a on (a.actor_name = c.actor_name AND a.gender = 'Female') 
GROUP BY m.movie_title, m.release_year; 
+0

этот запрос работает, но он не достигает вывода 0 для записей, которые не существуют. – Maddy

+0

А, да, вы правы. Я спешил и сделал этот COUNT (\ *), что не так. Вы были правы для подсчета непустых заявок. Я соответствующим образом редактирую свой ответ. И, конечно же, 'a.gender = 'Female'' принадлежит к предложению ON. –

+0

В качестве примечания к более позднему читателю: Это изначально опубликованный запрос Мани, только с небольшим изменением, чтобы ACTOR был включен слева, а гендерные критерии переместились в предложение ON, а также удалить ненужную часть UNION. Тем временем Мани сильно изменил запрос в запросе, поэтому запрос может выглядеть как мое собственное изобретение. Это не так. Это Мани. У этого были только незначительные недостатки. –

1
SELECT m.movie_title, m.release_year, 
     SUM(case when a.gender='Female' then 1 else 0 end) female_actors 
FROM MOVIE m LEFT JOIN CAST_MEMBER c on(m.movie_title=c.movie_title AND m.release_year=c.release_year) JOIN ACTOR a on(a.actor_name=c.actor_name) 
GROUP BY m.movie_title, m.release_year 
+0

Этот запрос работает только, если в CAST_MEMBER есть хотя бы одна запись на MOVIE (что является разумным предположением). Таким образом, вы можете включить LEFT JOIN на CAST_MEMBER в INNER JOIN (что и происходит неявно из-за INNER JOIN to ACTOR). Если вы также хотите рассчитывать на фильмы, в которых ни один актер еще не введен, включите INNER JOIN на ACTOR в LEFT JOIN. –