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

Mysql 转换查询:从右连接到左连接,mysql,sql,database,relational-database,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 T

假设我有以下表格: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之前,最后一个查询使用表1的字段

还是像这样

Select *
From T2
Left join (
   T3 left join T1
       On T1.FK3=T3.PK)
   On T1.FK2=T2.PK

您需要使用子查询首先将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);

第一种方法是颠倒表格的提及顺序:

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;

显然,方括号可以帮助您排序联接。我想知道这是否真的有文档记录,我在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);

不清楚你在问什么。你能展示样本数据和你想要的结果吗?为什么你需要它?我目前正在编写一个查询可视化工具。我坚持这个假设性的问题你不能这么做,这不会影响性能吗?是否真的需要使用子查询?是的,如果您想要相同的结果,您需要使用子查询。性能方面的问题:分析两个查询。oracle上的执行计划似乎是相同的。我对您的查询做了一些修改:这非常有效,谢谢。我必须说,我以前从未见过使用这种符号。它似乎在逻辑上是等价的,但实际上非常干净。这一点是不正确的,因为它以t1左连接t2的形式出现,这是不正确的@比157。不,它在t3左连接t1左连接t2处读取。链从t3开始非常重要。我同意,但是原始的右连接查询不会从t1返回任何行,如果它没有与t3或t2的链接,则您的查询会返回。所以这个回答是不正确的。@Bee157。对于
右侧外部联接
,这将是一个不正确的结果。右外部联接链应该返回上一个表中的所有值。你能用你的表结构和样本数据建立一个SQL数据库吗。该结构纯粹是假设性的,但显示了查询之间的差异。