Я только что немного застрял с некоторым SQL. Я не думаю, что смогу блестяще сформулировать вопрос, поэтому позвольте мне показать вам.
У меня есть две таблицы, одна вызывается, другая назначается на прием. Я пытаюсь вернуть количество назначенных человеку встреч (в том числе, если их ноль). Назначение содержит person_id
и существует индивидуальная запись person_id
. Так COUNT(person_id)
что это разумный подход.
Запрос:
SELECT person_id, COUNT(person_id) AS "number_of_appointments"
FROM appointment
GROUP BY person_id;
Вернет правильно, количество встреч, которые есть у person_id. Однако человек, у которого 0 встреч, не возвращается (очевидно, поскольку их нет в этой таблице).
Настройка оператора для взятия person_id из таблицы person дает мне что-то вроде:
SELECT person.person_id, COUNT(appointment.person_id) AS "number_of_appointments"
FROM appointment
JOIN person ON person.person_id = appointment.person_id
GROUP BY person.person_id;
Однако это по-прежнему будет возвращать только person_id, у которого есть встреча, а не то, что я хочу, что является возвращением с людьми, у которых нет встреч!
Есть предложения, пожалуйста?
источник
Ответы:
Для этого вам нужно внешнее соединение (и вам нужно использовать person как "управляющую" таблицу)
Причина, по которой это работает, заключается в том, что внешнее (левое) соединение вернется
NULL
для тех людей, у которых нет встречи. Агрегатная функцияcount()
не будет считатьNULL
значения, поэтому вы получите ноль.Если вы хотите узнать больше о внешних соединениях, вот хороший учебник: http://sqlzoo.net/wiki/Using_Null
источник
Вы должны использовать
LEFT JOIN
вместоINNER JOIN
источник
если вы выполните внешнее соединение (с подсчетом), а затем используете этот результат в качестве подтаблицы, вы можете получить 0, как ожидалось (благодаря функции nvl)
Пример:
источник
ИСПОЛЬЗУЙТЕ соединение, чтобы получить нулевое количество в результате, используя GROUP BY.
просто 'join' выполняет внутреннее соединение в MS SQL, поэтому Go для левого или правого соединения.
Если таблица, содержащая первичный ключ, упоминается первой в запросе, используйте соединение LEFT, иначе соединение RIGHT.
НАПРИМЕР:
.
Возьмите группу по из таблицы, которая имеет первичный ключ, и подсчитайте из другой таблицы, которая имеет фактические записи / детали.
источник
Чтобы еще меньше изменить исходный запрос, вы можете превратить свое соединение в
RIGHT
соединениеЭто просто основывается на выбранном ответе, но поскольку внешнее соединение находится в
RIGHT
направлении, нужно добавить только одно слово и меньше изменений. - Просто помните, что он есть и иногда может сделать запросы более читабельными и потребовать меньше перестроения.источник
Проблема с LEFT JOIN заключается в том, что если нет встреч, он все равно будет возвращать одну строку с нулем, которая при агрегировании с помощью COUNT станет 1, и будет казаться, что у человека есть одна встреча, когда на самом деле у них ее нет. Думаю, это даст правильный результат:
источник