У меня две таблицы в MySQL: ALUMNI и CALLRES.
Таблица ALUMNI имеет AlumID в качестве основного ключа. Он имеет 14483 рек.
Таблица CALLRES имеет CallKey в качестве основного ключа и имеет поле AlumID, которое индексируется. (Это внешний ключ для ALUMNI, но никаких формальных ограничений, обозначающих это.) CALLRES имеет около 18000 рецентов.
Следующий запрос работает нормально. (0,2 секунды, 14461 строк результатов)
SELECT ALUMNI.AlumID, MAX(CALLRES.CallTime), COUNT(CALLRES.Outcome)
FROM ALUMNI JOIN CALLRES ON (ALUMNI.AlumID = CALLRES.AlumID)
GROUP BY ALUMNI.AlumID
Однако этого не хватает, указав ALUMNI, у которого нет записей CALLRES. (Их не так много: 14483 - 14461 = 22 в настоящее время пропущены).
Я хочу получить их в списке, поэтому я хочу LEFT JOIN вместо JOIN. Я думаю, что добавленные записи будут иметь NULL в совокупных столбцах.
Это разрешено?
Когда я меняю запрос, просто меняя "JOIN" на "LEFT JOIN", я не получаю сообщение об ошибке, но запрос находится на неопределенный срок. Так:
SELECT ALUMNI.AlumID, MAX(CALLRES.CallTime), COUNT(CALLRES.Outcome)
FROM ALUMNI LEFT JOIN CALLRES ON (ALUMNI.AlumID = CALLRES.AlumID)
GROUP BY ALUMNI.AlumID
берет "навсегда". Спасибо за любой совет.
Если вы хотите получить недостающий список, вы можете сделать:
SELECT ALUMNI.AlumID
FROM ALUMNI LEFT JOIN CALLRES ON (ALUMNI.AlumID = CALLRES.AlumID)
WHERE CALLRES.AlumID IS NULL
ИЛИ ЖЕ
SELECT ALUMNI.AlumID FROM ALUMNI
WHERE ALUMNI.AlumID NOT IN (SELECT AlumID FROM CALLRES)
Я думаю, что первый SQL лучше.