转换查询:右连接到左连接

时间:2014-03-16 09:19:27

标签: mysql sql database relational-database

假设我有以下表格: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

3 个答案:

答案 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);

SQL Fiddle

答案 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;