如果存在引用,则在SQL中选择不存在的行

时间:2014-02-08 22:09:39

标签: sql postgresql

假设我有一个ratinguserclient唯一的表ratinguser_id的架构会包含client_idscore以及其他一些信息(例如comment*)。

在某些时候,我可能会遇到以下情况:rating表示对应的user_idclient_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}}

2 个答案:

答案 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

在这种情况下,我们希望userclient的每个组合都有一行,因此该部分需要CROSS JOINratings表{{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}中一样在这个例子中。)