显示SQL Server查询中的所有记录,同时有条件排除联接的记录

时间:2018-07-18 18:45:50

标签: sql database conditional left-join

在左外部联接中,如何始终确保获得左表中的所有记录(当不存在匹配项时,右表中的值为null),并且能够有条件地从右表(例如仅在右表“活动”列设置为1或不存在匹配项时联接)。当我有条件地从右表中排除记录时,它也会从我的左表中排除联接的记录。

我的查询示例:

SELECT people.personID, people.name, documents.documentID, documents.score FROM people 
LEFT OUTER JOIN documents ON people.personID = documents.personID 
WHERE (documents.active = 1 OR documents.active IS NULL)

这将显示我的所有人员记录,除非只有一个匹配的文档的“活动”列值为0,在这种情况下,当我希望它仍然显示时,它将排除该匹配项的整个人员记录人员记录,但将活动文档的匹配文档记录设置为null时将其设置为0。最好避免使用“ CASE WHEN”类型的语言,但是如果那是唯一的方法,那么它将这样做。

1 个答案:

答案 0 :(得分:1)

您可以在join语句中获得文档条件:

SELECT people.personID, people.name, documents.documentID, documents.score 
FROM people 
LEFT OUTER JOIN documents ON people.personID = documents.personID AND documents.active = 1 

或过滤器是子查询:

SELECT people.personID, people.name, documents.documentID, documents.score 
FROM people 
LEFT OUTER JOIN 
    (SELECT * FROM documents WHERE documents.active = 1) AS documents 
ON people.personID = documents.personID