我有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
这适用于前2个条件。但是无法合并第三次加入。任何人都可以建议一种方法来帮助这个吗? 提前谢谢。
答案 0 :(得分:3)
从你的问题我想你只想要来自t3的行与t2中与t1连接的行连接:
SELECT
*
FROM
t1
LEFT JOIN t2 ON t1.col1 = t2.col1
LEFT JOIN t3 ON t1.col2 = t3.col1 AND t2.col2 = t3.col2
除非来自t2的行已经与col1上的t1连接,否则这将不包括来自t2和t3的连接col2的行。
答案 1 :(得分:3)
您可以有多种变体,所有变体都有不同的结果集。其他人中的哪一个是初衷,如果不是不可能让其他人知道:
(变体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。