【问题标题】:How do you multiple left join the same table from 2 different tables in the same query?如何在同一个查询中从 2 个不同的表中多次左连接同一个表?
【发布时间】:2019-09-22 21:17:51
【问题描述】:

我正在重构一些使用 *= 运算符而不是首选的 ANSI LEFT JOIN 语法的旧 SQL Server 存储过程。我正在处理的一个过程给我带来了麻烦,因为它试图在同一个 FROM 子句中从 2 个不同的表中加入同一个表,并且它返回的结果与返回的原始旧过程不同。

我已经重构了大约 20 个其他存储过程,但它们都没有像这样在同一张表上进行多个左连接。旧的 *= 运算符似乎简化了这一操作。如您所见,在同一个 where 子句中加入 table3 非常简单。

旧代码

选择 ... TABLE3.column10

来自表 1、表 2、表 3
在哪里 TABLE1.column5 *= TABLE3.column5
和 TABLE2.column8 *= TABLE3.column8

新代码

选择
TABLE3.colum10

来自
表1
左连接表 3 T3a
ON TABLE1.column5 = T3a.column5,

表 2
左连接表 3 T3b
ON TABLE2.column8 = T3b.column8

现在,由于我必须在新的 from 子句中为 TABLE3 设置别名,因此我在选择 column10 时没有得到预期的结果。

我希望通过查看新旧查询,您可以了解我的目标。如有必要,我可以提供更多详细信息,但我会尽量让我的问题尽可能简单。

【问题讨论】:

  • 通过别名参考您的SELECT 中的表格。此外,您真的应该一直使用 ANSI-92 JOIN 语法;不仅仅是当您不能再使用 ANSI-89 LEFT JOIN 语法时。旧语法在 27 年前被替换是有充分理由的。 :) 我假设您在第二个查询中不是在 CROSS JOINTABLE2 之后?这就是你目前拥有的。如果您打算改用CROSS JOIN,如果不是,请使用正确的INNER JOIN
  • 回答您的问题的一个困难是,关于 3+ 表旧式连接如何保证工作或被视为工作,或给出与文档相反的错误答案的文档或示例很少,或被 SQL Server 迁移工具正确或错误地翻译。因此,如果您提供一些示例实际输出并描述您在此处“期望”的翻译,将会有很大帮助。无论如何:请在代码问题中给出minimal reproducible example--cut & paste & runnable code;具有期望和实际输出的示例输入(包括逐字错误消息);明确的规范和解释。

标签: sql sql-server left-join


【解决方案1】:

你为什么不这样做?

SELECT t3.colum10 
FROM TABLE1 t1 CROSS JOIN
     TABLE2 t2 LEFT JOIN
     TABLE3 T3
     ON t1.column5 = T3a.column5 AND
        t2.column8 = T3b.column8;

实际上,我对旧语法有点困惑,但我认为你想要:

SELECT t3.colum10 
FROM TABLE3 t3 LEFT JOIN
     TABLE1 t1
     ON t1.column5 = T3.column5 LEFT JOIN
     TABLE2 t2
     ON t2.column8 = T3.column8;

或者至少这个逻辑对我来说更有意义,关于这三个表。但是,这里的连接是多余的。

【讨论】:

  • 必须承认,这似乎是一个奇怪的查询(并不是说这里的答案是错误的)。考虑到查询有一个LEFT JOINTABLE3,那么这将返回值为NULL 的行并且不显示其他表中的其他列;使行几乎没有意义。
  • @Larnu 。 . .我认为第二个查询是正确的。我认为*= 意味着将所有行保留在 other 一侧,所以它真的希望table3 成为第一。
  • 你可能是对的。不过,这仍然是一个令人困惑的查询,好像后者是正确的,那么除了创建重复行之外,为什么还要执行 LEFT JOIN 呢?也许OP过度简化了查询;但如果是这样,那可能意味着我们离这里很远。 ://
  • *= for the LEFT OUTER JOIN 第二个查询是最接近的,是的,SQL Server 的旧语法总是让事情变得令人毛骨悚然。感谢上帝,他们将其更改为 ANSI。
  • CROSS JOIN 拯救了这一天!没想到,显然不是我的强项,哈哈……谢谢你拯救了我的一周!
猜你喜欢
  • 1970-01-01
  • 2016-04-12
  • 2011-04-23
  • 1970-01-01
  • 2020-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多