Почему «НЕ ВХОДИТ» и «НЕ СУЩЕСТВУЕТ»? - PullRequest
0 голосов
/ 24 апреля 2020

Я пытался выполнить это 1015 * несколькими разными способами, и у меня не получится. Я пытаюсь выяснить идентификаторы клиентов, которые не запланировали встречу в этом году.

Мой первый запрос занимает навсегда , и большую часть времени занимает тайм-аут:

SELECT c.clientId
FROM clients c
WHERE NOT EXISTS (
   SELECT a.appointmentId FROM appointments a WHERE a.date >= "2020-02-15" AND c.clientId = a.clientId)

Мой второй запрос очень быстрый, но, скорее всего, он не принимает НЕ в расчет. Результаты показывают то же самое, как если бы я запустил запрос без NOT EXISTS. Я думаю, это означает, что я не соответствую a.clientId = c .clientId. Но я не могу понять, как заставить это работать.

SELECT c.clientId
FROM clients c
WHERE c.clientId NOT IN (
    SELECT a.appointmentId FROM appointments a WHERE a.date >= "2020-02-15")

Я также попробовал это третьим способом без удачи, он возвращает пустой набор:

SELECT c.clientId
FROM clients c
LEFT JOIN appointments a
ON a.clientId = c.clientId
WHERE a.appointmentId IS NULL
AND a.date >= '2020-02-15'

Заранее спасибо!

1 Ответ

1 голос
/ 24 апреля 2020

Проблема с вашим вторым запросом состоит в том, что вы сравниваете clientId в client с appointmentId в appointments, поэтому вряд ли будет выполняться какая-либо фильтрация. Он должен быть записан как

SELECT clientId
FROM clients
WHERE clientId NOT IN (
    SELECT clientId FROM appointments WHERE date >= "2020-02-15")

Проблема с вашим третьим запросом заключается в том, что условие a.date >= '2020-02-15' в предложении WHERE эффективно превращает ваш LEFT JOIN в INNER JOIN (см. руководство ), поэтому a.appointmentId IS NULL никогда не соответствует действительности. Вам нужно добавить date сравнение к условию JOIN:

SELECT c.clientId
FROM clients c
LEFT JOIN appointments a
ON a.clientId = c.clientId AND a.date >= '2020-02-15'
WHERE a.appointmentId IS NULL

Обратите внимание, что если вы хотите all , это значение clientId, вам не нужно используйте таблицу clients вообще:

SELECT clientId
FROM appointments
GROUP BY clientId
HAVING MAX(date) < '2020-02-15'

Демонстрация на dbfiddle

...