[英]SQL join problem
当第二张表中没有匹配项时,我想从一张表中检索所有记录。
因此,这与内部联接相反。
您需要一个LEFT JOIN WHERE IS NULL查询(又名外部联接):
SELECT table1.*
FROM table1
LEFT OUTER JOIN table2
ON table1.id = table2.id
WHERE table2.id IS NULL
或NOT IN:
SELECT *
FROM table1
WHERE id NOT IN (SELECT id FROM table2)
这是一个外部联接:
SELECT *
FROM tableA AS a
LEFT JOIN tableB AS b USING(x)
说您有:
表A:
a | x
-----
1 | 1
3 | 3
表B:
b | x
-------
1 | 'a'
2 | 'b'
那么上面的查询会给你
a | b | x
------------
1 | 'a' | 1
3 | NULL | 3
如果你想
a | b | x
----------------
1 | 'a' | 1
NULL | 'b' | 2
3 | NULL | 3
您必须使用FULL OUTER JOIN
而不是LEFT JOIN
。
编辑 :正如拉里·卢斯蒂格(Larry Lustig)告诉我的一样(重新阅读问题后,我认为是正确的),OP不需要B中的任何行。因此查询应为:
SELECT a.*
FROM tableA AS a
LEFT JOIN tableB AS b USING(x)
WHERE b.x IS NULL
那会产生
a | x
-------
3 | 3
您有三种选择:
相关子查询。
SELECT * FROM TableA不存在(SELECT * FROM TableB WHERE TableB.ID = TableA.ID)
不相关的子查询。
SELECT * FROM TableA不在其中的ID(SELECT ID从TableB)
使用NULL消除的OUTER JOIN。
选择*从TableA左[外部]在TableA.ID = TableB.ID上加入TableB在TableB.ItsPrimaryKey不为空的情况下
在最后一个示例中,一些DBMS需要单词OUTER,一些允许它,而有些根本不允许。
根据DBMS,各种选项可能会产生不同的执行计划和不同的性能。 选择一个表现最好的,最能表达您意图的产品。
内部联接的“对立”称为外部联接。
我相信您正在寻找FULL OUTER JOIN(适用于Oracle 9i +)。
编辑:没有很好地阅读您的问题...如果您只想要第二个表的NULL值,请左联接
外加入。 从技术上讲可能是FULL OUTER JOIN;)
向约翰内斯·韦斯(JohannesWeiß)的解决方案添加您在表a中查找对象而在表b中不包含对象的其他问题的解决方案:
SELECT *
FROM tableA AS a
LEFT JOIN tableB AS b
USING(x)
WHERE b.foo IS NULL
您正在寻找LEFT JOIN或FULL OUTER JOIN,但并非所有DBMS都支持FULL。
用UNION进行模拟是可能的,例如MySQL:
SELECT * FROM t1
LEFT JOIN t2 ON t1.id = t2.id
UNION
SELECT * FROM t1
RIGHT JOIN t2 ON t1.id = t2.id
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.