繁体   English   中英

SQL联接问题

[英]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

您有三种选择:

  1. 相关子查询。

    SELECT * FROM TableA不存在(SELECT * FROM TableB WHERE TableB.ID = TableA.ID)

  2. 不相关的子查询。

    SELECT * FROM TableA不在其中的ID(SELECT ID从TableB)

  3. 使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM