假设我有以下表格:T1,T2和T3。 我怎么能仅使用左连接来改写以下查询。
Select *
From T1
Right join T2 On T1.FK2=T2.PK
Right join T3 On T1.FK3=T3.PK
以下尝试不正确:
Select *
From T2
Left join T1 On T1.FK2=T2.PK
Left join T3 On T1.FK3=T3.PK
T3在加入的错误一侧。以下是可能的:
Select *
From T2
Left join T3 On T1.FK3=T3.PK
Left join T1 On T1.FK2=T2.PK
我无法找到一种方法将表2和3放在1的左侧并使用相应的字段来连接所有表格?在查询中提到此表之前,最后一个查询使用表1的字段。
还是这样的?
Select *
From T2
Left join (
T3 left join T1
On T1.FK3=T3.PK)
On T1.FK2=T2.PK
答案 0 :(得分:1)
显然,括号可以帮助您订购联接。我想知道这是否真的记录在案,我在mysql文档中一眼就看不到任何东西。 以下查询是正确的,并且没有任何子查询:
Select T1.Id Ida, t2.id idb, T3.id idc FROM T3
LEFT JOIN
(T2
LEFT JOIN T1 ON (T1.ID = T2.ID))
ON (T1.ID= T3.ID);
答案 1 :(得分:0)
您需要使用子查询首先将t1与t2连接,然后将结果与t3连接:
SELECT T.ID1 ID1, T.ID2 ID2, T3.ID ID3 FROM T3
LEFT JOIN
(SELECT T1.ID ID1, T2.ID ID2 FROM T2
LEFT JOIN T1 ON (T1.ID = T2.ID)) T
ON (T.ID1 = T3.ID);
答案 2 :(得分:0)
第一种方法是颠倒提到表格的顺序:
Select *
from t3 left outer join
t2
on T1.FK3 = T3.PK left outer join
t1
on T1.FK2 = T2.PK
但这不会起作用,因为第一个条件是t1
而不是t2
。并且t2
尚未定义。
在左外连接或右外连接中使用表链时,只有第一个(或最后一个)表很重要,因为它们"驱动"查询。 "驱动"从某种意义上说,即使没有匹配,它们也能提供所有值。所以,以下应该做你想做的事:
Select *
from t3 left outer join
t1
on T1.FK3 = T3.PK left outer join
t2
on T1.FK2 = T2.PK;