从Table1左连接table2;和“;从Table2右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语句中左连接和右连接的区别。

309658 次浏览

你的两个表述是等价的。

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

Select * from Table1 left join Table2 ...

而且

Select * from Table2 right join Table1 ...

是完全可以互换的。但是,请尝试Table2 left join Table1(或其相同的一对Table1 right join Table2)来查看区别。这个查询应该提供更多的行,因为Table2包含一个id在Table1中不存在的行。

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

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

你正在获取数据的表是'LEFT'.
. 你要加入的表是“RIGHT”.
LEFT JOIN:从左表中取出所有的项,并(仅)从右表中取出匹配的项 右连接:从右表中取出所有的项,并(仅)从左表中取出匹配的项 所以:< / p >

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

你是正确的连接表与更少的行表与更多的行
和< br > 再次,左连接表较少的行与表较多的行
试一试:< / p >

 If Table1.Rows.Count > Table2.Rows.Count Then
' Left Join
Else
' Right Join
End If
我觉得我们可能需要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的所有结果

< p > <强> select * 从表1 左连接Table2到Table1。id = Table2.id

在第一个查询中,左连接比较了左半球表1右侧表二

其中表1的所有属性将被显示,而在表二中,只有那些条件为真的属性将被显示。

< p > <强> select * 从表二 在Table1上右连接Table1。id = Table2.id

在第一个查询中,正确的连接比较了右侧表1左半球表二

其中表1的所有属性将被显示,而在表二中,只有那些条件为真的属性将被显示。

两个查询将给出相同的结果,因为查询中表声明的顺序不同就像你在左第一联接查询中分别在左右中声明表1表二,在第二次右连接查询中也分别在左右中声明表1表二

这就是为什么在两个查询中得到相同结果的原因。如果你想要不同的结果,那就分别执行这两个查询,

< p > <强> select * 从表1 左连接Table2到Table1。id = Table2.id

< p > <强> select * 从表1 右连接Table2到Table1。id = Table2.id

< p > 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的名字列,这些列依次来自第一个第二个表。

< p > <代码> * select * 从表1 左连接Table2到Table1。id = Table2.id

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

< p > <代码> select * 从表二 在Table1上右连接Table1。id = Table2.id**

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