在WHERE子句中复制LEFT OUTER JOIN

时间:2009-09-09 18:14:36

标签: sql

如何在WHERE子句中复制LEFT OUTER JOIN?本质上,我想在FROM子句中使用交叉而不是连接,然后相应地过滤第二个表:


    SELECT A.KEY, B.KEY
    FROM A, B
    WHERE ?????;
注意,在任何一种情况下,密钥都不会为空,并且将是唯一的。

4 个答案:

答案 0 :(得分:4)

假设您要加入的列是两个表中的KEY

SELECT A.KEY, B.KEY
FROM A, B
WHERE A.KEY *= B.KEY

答案 1 :(得分:2)

可能不适用,但提到的A.KEY *= B.KEYhistory in later versions of MS SQL Server,搜索“Use of *= and =*

这里不会超过我们的代码评论...

答案 2 :(得分:2)

大卫,

我的神秘答案是“你做不到。”尽管其他人给出了答案,但交叉连接并不包含您想要的信息。如果将交叉连接的结果集限制为交叉连接的子集(这是WHERE子句的用途),则无法获得所需的结果。当然,除非你使用邪恶和邪恶的* =运算符,否则它会改变WHERE子句的数学/关系含义。

Yaraher对UNION的建议是合理的思考(如果执行不好),事实上,在SQL标准中,OUTER联接是根据与联盟的内部联接来定义的。因此,如果你反对单词OUTER,你可以这样做:

SELECT A.KEY, B.KEY
FROM A, B
WHERE A.KEY *= B.KEY
UNION ALL
SELECT A.KEY, NULL
FROM A
WHERE NOT EXISTS (
  SELECT * FROM B AS B2
  WHERE B2.KEY = A.KEY
)

但缺少像*这样的语言,你不能通过要求更少(添加WHERE子句)来获得更多(外部行)。

我全心全意地同意gbn,他说* =“以后会咬你的。”或者它会咬人,成为你的错。它是邪恶的(我说过了吗?),事实上,包含该运算符的一些更复杂的查询根本没有明确定义。如果* =运算符被隐藏在某个地方的某个视图中,那么就会遇到麻烦。

使用* =是不负责任的。这就像使用18号线连接20安培电路的开关恰好只用于半安培电机。如果有一个类似于电子代码的SQL代码,* =将不符合代码。 (幸运的是,在某些商店,如亚当,它没有。)

(你甚至无法输入Stackoverflow太靠近Italic文本而不转义它,它太糟糕了。)

答案 3 :(得分:0)

为什么不使用UNION?

(SELECT KEY FROM A WHERE ????) 
UNION
(SELECT KEY FROM B WHERE ????) ;