如何在WHERE子句中复制LEFT OUTER JOIN?本质上,我想在FROM子句中使用交叉而不是连接,然后相应地过滤第二个表:
SELECT A.KEY, B.KEY
FROM A, B
WHERE ?????;
注意,在任何一种情况下,密钥都不会为空,并且将是唯一的。
答案 0 :(得分:4)
假设您要加入的列是两个表中的KEY
,
SELECT A.KEY, B.KEY
FROM A, B
WHERE A.KEY *= B.KEY
答案 1 :(得分:2)
可能不适用,但提到的A.KEY *= B.KEY
为history 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 ????) ;