ChatGPT解决这个技术问题 Extra ChatGPT

“from Table1 left join Table2”和“from Table2 right join Table1”可以互换吗?

例如,有两个表:

create table Table1 (id int, Name varchar (10))

create table Table2 (id int, Name varchar (10))

表1数据如下:

    Id     Name     
    -------------
    1      A        
    2      B    

表2数据如下:

    Id     Name     
    -------------
    1      A        
    2      B 
    3      C

如果我执行下面提到的两个 SQL 语句,两个输出将是相同的:

select *
from Table1
  left join Table2 on Table1.id = Table2.id

select *
from Table2
  right join Table1 on Table1.id = Table2.id

请说明上述 SQL 语句中左连接和右连接的区别。


P
Péter Török
Select * from Table1 left join Table2 ...

Select * from Table2 right join Table1 ...

确实是完全可以互换的。但是,请尝试 Table2 left join Table1(或其相同的一对 Table1 right join Table2)来查看差异。这个查询应该给你更多的行,因为 Table2 包含一个 ID 不在 Table1 中的行。


那么,如果我们仅使用 LEFT JOIN 就可以达到任何预期的结果,为什么还需要 RIGHT JOIN? :P
Select * from Table1 left join Table 2 将返回表 1 的所有记录加上表 2 的重合记录。相反的 Select * from Table1 right join Table 2 将返回表 2 中的所有记录和表 1 的重合记录。希望对您有所帮助。
如果您使用超过 2 个表,则使用右连接可能是有意义且可读的
@ProgramadorAdagal 这并不能解释为什么我们两者都有,你可以只用一个或另一个得到相同的结果:SELECT * FROM Table1 LEFT JOIN Table2SELECT * FROM Table2 LEFT JOIN Table1
@MarkusMeskanen 您正在更改一个 7 个单词的简单句子。当你有一个包含多个子句的 356 行句子并且需要改变左右的逻辑时,你会想知道只用一个单词来改变它......
l
laalto

您从中获取数据的表是“左”。您要加入的表是“正确的”。 LEFT JOIN:从左表中取出所有项目和(仅)从右表中匹配项目。 RIGHT JOIN:从右表中取出所有项目和(仅)从左表中匹配项目。所以:

Select * from Table1 left join Table2 on Table1.id = Table2.id  

给出:

Id     Name       
-------------  
1      A          
2      B      

但:

Select * from Table1 right join Table2 on Table1.id = Table2.id

给出:

Id     Name       
-------------  
1      A          
2      B   
3      C  

你是右加入表,表上的行少,行多,再一次,左加入表,表上的行少,行多试试:

 If Table1.Rows.Count > Table2.Rows.Count Then  
    ' Left Join  
 Else  
    ' Right Join  
 End If  

o
onedaywhen

您似乎在问,“如果我可以使用 LEFT OUTER JOIN 语法重写 RIGHT OUTER JOIN,那么为什么还要使用 RIGHT OUTER JOIN 语法?”我认为这个问题的答案是,因为语言的设计者不想对用户施加这样的限制(我认为如果他们这样做会受到批评),这会迫使用户改变表格的顺序在某些情况下仅更改联接类型时,在 FROM 子句中。


有时左右外连接完全可以互换,对吗?
@Alex:确实左外连接和右外连接总是可以互换的。
M
Malachi
select fields 
from tableA --left
left join tableB --right
on tableA.key = tableB.key

此示例 tableA 中的 from 中的表位于关系的左侧。

tableA <- tableB
[left]------[right]

因此,如果您想从左表 (tableA) 中取出所有行,即使右表 (tableB) 中没有匹配项,您也将使用“左连接”。

如果您想从右表 (tableB) 中取出所有行,即使左表 (tableA) 中没有匹配项,您也将使用 right join

因此,以下查询等同于上面使用的查询。

select fields
from tableB 
right join tableA on tableB.key = tableA.key

J
JNK

你的两个陈述是等价的。

大多数人只使用 LEFT JOIN,因为它看起来更直观,而且它是通用语法 - 我认为并非所有 RDBMS 都支持 RIGHT JOIN


“我认为并非所有 RDBMS 都支持 RIGHT JOIN”——当然,并非所有 RDBMS 都支持 SQL。但是,如果您暗示某些 SQL 产品支持 LEFT 但不支持 RIGHT,请指出哪些产品。
@onedaywhen 例如,SQLite 3 没有实现 RIGHTFULL OUTER JOIN sqlite.org/omitted.html
m
mega6382

我觉得我们可能需要 Outer Excluding JOIN 最后一个数字的 where 子句中的 AND 条件,以便我们得到 A Union B Minus A Interaction B 的预期结果。我觉得查询需要更新为

SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL AND B.Key IS NULL

如果我们使用 OR ,那么我们将得到 A Union B 的所有结果


C
Community

select * from Table1 left join Table2 on Table1.id = Table2.id

在第一个查询中,左连接将左侧表 table1 与右侧表 table2 进行比较。

其中将显示 table1 的所有属性,而在 table2 中仅显示条件为真的那些属性。

select * from Table2 right join Table1 on Table1.id = Table2.id

在第一个查询中,右连接将右侧表 table1 与左侧表 table2 进行比较。

其中将显示 table1 的所有属性,而在 table2 中仅显示条件为真的那些属性。

两个查询将给出相同的结果,因为查询中表声明的顺序不同,例如您在第一个左连接查询中分别在左和右声明 table1 和 table2,并且在第二个右连接中分别在右和左声明 table1 和 table2询问。

这就是您在两个查询中得到相同结果的原因。因此,如果您想要不同的结果,请分别执行这两个查询,

select * from Table1 left join Table2 on Table1.id = Table2.id

select * from Table1 right join Table2 on Table1.id = Table2.id


V
VDWWD

Select * from Table1 t1 Left Join Table2 t2 on t1.id=t2.id 根据定义:Left Join 选择表 1 中使用“select”关键字提及的所有列以及表 2 中与“on”关键字之后的条件匹配的列。

同样,根据定义:Right Join 选择表 2 中使用“select”关键字提及的所有列以及表 1 中与“on”关键字之后的条件匹配的列。

参考您的问题,将两个表中的 id 与需要在输出中抛出的所有列进行比较。因此,id 1 和 2 在两个表中都很常见,因此结果中您将有四列,其中依次来自第一个和第二个表的 id 和 name 列。

*select * from Table1 left join Table2 on Table1.id = Table2.id

上面的表达式,它从表 1 和列中获取所有记录(行),并从表 2 中获取表 1 和表 2 中匹配的 id。

select * from Table2 right join Table1 on Table1.id = Table2.id**

与上面的表达式类似,它从表 1 和列中获取所有记录(行),并从表 2 中获取表 1 和表 2 中的匹配 id。(请记住,这是一个右连接,所以表 2 中的所有列而不是从表 1 将被考虑)。