我有 3 个表 t1、t2、t3。我想要一个基于这些条件的结果集:t1 在 t2 上有外部连接(t1 的所有行),t1 在 t3 上有外部连接(t1 的所有行)和 t2 在 t3 上有外部连接(t2 的所有行)。如何在单个查询中使用这些外部 3 连接? 基本上我想将 t-sql 格式查询转换为 ANSI 格式。原来的查询是这样的
Select * from t1, t2, t3
where t1.col1 *= t2.col1
and t1.col2 *= t3.col1
and t2.col2 *= t3.col2
我设法将前 2 个连接用作
Select *
from t1
left join t2 on t1.col1 = t2.col1
left join t3 on t1.col2 = t3.col1
这适用于前两种情况。但是无法合并第三个连接。任何人都可以建议一种方法来完成这个吗? 提前致谢。
最佳答案
您可以有多种变体,所有变体都具有不同的结果集。其他人很难甚至不可能分辨出其中哪一个是初衷:
(变体 1 - Tobsey 的查询,先连接到 t2,再连接到 t3,相当于:
SELECT
*
FROM
t1
INNER JOIN --- or LEFT JOIN
t2
ON t1.col1 = t2.col1
LEFT JOIN
t3
ON t1.col2 = t3.col1
AND t2.col2 = t3.col2 --- this line makes the first LEFT join
--- equal to INNER join
(变体 2 - 首先连接到 t3,然后连接到 t2):
SELECT
*
FROM
t1
INNER JOIN --- or LEFT JOIN
t3
ON t1.col2 = t3.col1
LEFT JOIN
t2
ON t1.col1 = t2.col1
AND t3.col2 = t2.col2
(变体 3a - 首先将 t2 连接到 t3,然后将 t1 连接到该连接):
SELECT
*
FROM
t1
LEFT JOIN
t2
LEFT JOIN
t3
ON t2.col2 = t3.col2
ON t1.col1 = t2.col1
AND t1.col2 = t3.col1
如果您将第一个或第二个 LEFT
连接替换为 INNER
连接,则变体 3 可以有更多的子变体。
我猜你想要变体 3a。
关于SQL 多外部连接(将 t-sql 连接转换为 ANSI 格式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9501089/