sql - 如何在同一个查询中从 2 个不同的表中多次左连接同一个表?
问题描述
我正在重构一些使用 *= 运算符而不是首选的 ANSI LEFT JOIN 语法的旧 SQL Server 存储过程。我正在处理的一个过程给我带来了麻烦,因为它试图在同一个 FROM 子句中从 2 个不同的表中加入同一个表,并且它没有返回与返回的原始旧过程相同的结果。
我已经重构了大约 20 个其他存储过程,但它们都没有像这样在同一张表上进行多个左连接。旧的 *= 运算符似乎简化了这一操作。如您所见,在同一个 where 子句中加入 table3 非常简单。
旧代码
选择 ... TABLE3.column10
来自 TABLE1、TABLE2、
TABLE3 其中 TABLE1.column5 *= TABLE3.column5
和 TABLE2.column8 *= TABLE3.column8
新代码
从
TABLE1中选择
TABLE3.colum10
左连接 TABLE3 T3a
ON TABLE1.column5 = T3a.column5,
TABLE2
LEFT JOIN TABLE3 T3b
ON TABLE2.column8 = T3b.column8
现在,由于我必须在新的 from 子句中为 TABLE3 起别名,所以在我选择的 column10 中没有得到预期的结果。
我希望通过查看新旧查询,您可以了解我的目标。如有必要,我可以提供更多详细信息,但我会尽量让我的问题尽可能简单。
解决方案
你为什么不这样做?
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;
或者至少这个逻辑对我来说更有意义,关于这三个表。但是,这里的连接是多余的。
推荐阅读
- c++ - 多线程暂停/恢复
- javascript - 在反应中将值从孩子发送给父母
- python - 如何在胶水作业中使用 Awswrangler?
- python - 如何使用 Python 将文本中的信息放入 CSV
- python - 是否可以使用电子表格 api 获取某个单元格的范围?
- r - dplyr::summarise 根据另一列 max 拉取值
- python - 如何在 R 中安装 Tensorflow 和 Keras?
- java - 基于点注解的Java嵌套POJO更新
- go - 如何使用 OID 读取密钥信息和密钥签名等扩展值
- jwt - NestJS - 如何在 jwt 服务上创建包装服务(来自 jwt 模块)