【问题标题】:Replicate LEFT OUTER JOIN in WHERE clause在 WHERE 子句中复制 LEFT OUTER JOIN
【发布时间】:2010-11-26 22:29:39
【问题描述】:

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


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

【问题讨论】:

  • 想要达到什么目的?不太懂cross join,filter 2nd table bit...

标签: sql


【解决方案1】:

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

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

【讨论】:

【解决方案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 代码,就像有一个电气代码一样,*= 不会满足代码。 (幸运的是,在一些商店,比如 Adam's,它没有。)

(你甚至不能在 Stackoverflow 中输入太接近斜体文本而不转义它,这太糟糕了。)

【讨论】:

    【解决方案3】:

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

    这里不会通过我们的代码审查...

    【讨论】:

    • 我不想看起来像是在支持它。确实,我永远不会使用它,也不会允许其他任何人使用它,但这是我所知道的唯一符合他要求的解决方案。
    • @Adam:当然……他可能使用的是旧的 Sybase 平台等
    • 在这种情况下,我正在向现有代码库添加一个不使用连接(内部或外部)的功能,因此我想保持原始样式。虽然我更喜欢使用连接,但 *= 运算符将在这种情况下工作。 (这可能是一件我什至不知道的好事)。
    【解决方案4】:

    为什么不使用 UNION?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-30
      • 2016-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-04
      • 2013-03-10
      • 2013-05-22
      相关资源
      最近更新 更多