为什么 "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
中的 clientId
与 appointments
中的 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
注意,如果你要的all是clientId
值,你根本不需要使用clients
table :
SELECT clientId
FROM appointments
GROUP BY clientId
HAVING MAX(date) < '2020-02-15'
我已经尝试通过几种不同的方式来实现这一点,但我做空了。我正在尝试找出今年未安排约会的客户的 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
中的 clientId
与 appointments
中的 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
注意,如果你要的all是clientId
值,你根本不需要使用clients
table :
SELECT clientId
FROM appointments
GROUP BY clientId
HAVING MAX(date) < '2020-02-15'