为什么 "NOT IN" 和 "NOT EXISTS" 不工作?

Why aren't "NOT IN" and "NOT EXISTS" working?

我已经尝试通过几种不同的方式来实现这一点,但我做空了。我正在尝试找出今年未安排约会的客户的 ID。

我的第一个查询持续 ,并且大部分时间超时:

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 IN。结果显示的结果与我 运行 没有 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")

我也尝试了第三种方法,但没有成功,它returns是一个空集:

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'

提前致谢!

您的第二个查询的问题是您将 client 中的 clientIdappointments 中的 appointmentId 进行比较,因此不太可能进行任何过滤。应该写成

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

您的第三个查询的问题是 WHERE 子句中的 a.date >= '2020-02-15' 条件有效地将您的 LEFT JOIN 变成了 INNER JOIN(请参阅 manual), 因此 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

注意,如果你要的allclientId值,你根本不需要使用clientstable :

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

Demo on dbfiddle