假设我有一个rating
对user
和client
唯一的表rating
。
user_id
的架构会包含client_id
和score
以及其他一些信息(例如comment
和*
)。
在某些时候,我可能会遇到以下情况:rating
表示对应的user_id
和client_id
存在 user1 user2 user3 user4
client1 * * * *
client2 * * * *
client3 * *
client4 * * *
。
user_id
在纯SQL中,如何选择client_id
和*
元素的行,其中user_id client_id
-------- ---------
2 3
2 4
4 3
不存在?
在我的例子中,正确的结果应该是
{{1}}
答案 0 :(得分:3)
尝试类似:
SELECT *
FROM users
CROSS JOIN clients
WHERE NOT EXISTS (SELECT 1
FROM rating
WHERE rating.user_id = users.user_id
AND rating.client_id = clients.client_id)
答案 1 :(得分:1)
我接近这个的方法是构建一个涉及LEFT JOIN
的查询,其中包括每个组合是否有效,然后过滤到那些没有rating
部分数据的组合JOIN
。
在这种情况下,我们希望user
和client
的每个组合都有一行,因此该部分需要CROSS JOIN
,ratings
表{{1}转到那个。
以下是包含所有可能组合的查询,以及可用的评分(Live Demo):
LEFT JOIN
从该输出中,我们希望能够找到不存在评级的组合,我们只需添加SELECT
U.user_name,
C.client_name,
R.rating
FROM
users as U
CROSS JOIN
clients as C
LEFT JOIN
ratings as R
On R.user_id = U.user_id
And R.client_id = C.client_id
ORDER BY
U.user_name,
C.client_name;
(Live Demo):
WHERE R.rating IS NULL
(请注意,SQL中没有特定的语法来说“Left Join与Right表中的任何内容都不匹配”,您只需要选择一个不可为空的列,就像我在{{1}中一样在这个例子中。)