SQL:加入三个表 - 组合内/外外连接?

时间:2011-03-02 15:24:07

标签: sql

在查看联接应该如何查找我正在尝试实现的特定结果集时遇到一些麻烦。

我有三个表:项目,建议,服务。建议只是项目和服务之间的连接表,即项目可以有零个或多个推荐服务;为了捕获该关系,Recommendations表为每个推荐记录都有一个project_id和service_id。

所以,相关领域:

Projects.id | Recommendations.project_id | Recommendations.service_id | Services.id

我正在尝试列出所有没有特定服务建议的项目列表。我有以下内容,它提取了所有没有任何建议的项目,那就是:

SELECT * from projects P 
LEFT OUTER JOIN Recommendations R ON P.id = R.project_id 
WHERE R.project_id IS NULL

我知道我也需要加入服务表,但我不确定应该如何构建它。任何提示都表示赞赏。

2 个答案:

答案 0 :(得分:2)

一个选项是子查询方法,没有任何连接:

SELECT * FROM projects WHERE NOT EXISTS (SELECT * FROM recommendations WHERE project_id=projects.id AND recommendations.service_id=10)

答案 1 :(得分:2)

SELECT P.* from projects P
LEFT JOIN Recommendations R 
    ON P.id = R.project_id 
LEFT JOIN  Services S 
    ON S.Service_id = R.service_id and s.ID = 10
WHERE s.service_id is null

这应该找到那些没有服务ID的记录是10.注意我拿出了哪里 子句R.project_id是NULL。您也可以使用子查询方法(可能更快,但同时测试两者。)

SELECT * 
FROM projects 
WHERE NOT EXISTS (SELECT * 
                    FROM recommendations R
                    JOIN  Services S 
                        ON S.Service_id = R.service_id 
                    WHERE project_id=projects.id and s.ID = 10)  

当然在现实生活中你不会想要使用select * ever。请将您想要的实际字段放在选择部分中。