我有以下工作选择:
SELECT
TableA.FullName
FROM
TableA,
TableB
WHERE
TableA.Contact = TableB.Contact
但是我在TableB中有一些在TableB.Contact
列中有NULL的行,我想展示它。我试过了:
WHERE
(TableA.Contact = TableB.Contact OR TableB.Contact IS NULL)
没有幸运。
答案 0 :(得分:2)
您需要使用LEFT JOIN
SELECT
a.FullName, a.Contact, b.Contact
FROM TableA a
LEFT JOIN TableB b ON b.Contact = a.Contact
WHERE
(a.Contact = b.Contact OR b.Contact IS NULL)
WHERE子句在这里是多余的 - 与LEFT JOIN
相同答案 1 :(得分:2)
您使用的是过时的JOIN格式。尝试将其更改为:
SELECT column1, column2, column3 FROM
TableA as a
LEFT JOIN TableB as b
ON a.contact = b.contact
使用左连接将从A中提取所有记录,无论B中是否存在匹配。这是各种连接如何工作的一个很好的解释:
http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/
另外,请注意我是专门提取我想要的列而不是*
。这是习惯使用SQL的好习惯。
更新:
发表评论后,您好像在寻找FULL OUTER JOIN
?
SELECT column1, column2
FROM TableA as a
FULL OUTER JOIN TableB as b
ON a.contact = b.contact
答案 2 :(得分:1)
尝试更改join
条件:
SELECT *
FROM TableA JOIN
TableB
ON TableA.Contact = TableB.Contact OR
TableA.Contact IS NULL AND TableB.Contact IS NULL;
left outer join
不会完全符合您的要求。它将所有行保留在TableA
中,但不检查匹配的值。
出于性能原因,以下内容可能会更好:
SELECT *
FROM TableA JOIN
TableB
ON TableA.Contact = TableB.Contact
UNION ALL
SELECT *
FROM TableA CROSS JOIN
TableB
WHERE TableA.Contact IS NULL AND TableB.Contact IS NULL;