例如,有两个表:
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语句中左连接和右连接的区别。
select fields
from tableA --left
left join tableB --right
on tableA.key = tableB.key
在本例tableA中,from中的表位于关系的左侧。
tableA <- tableB
[left]------[right]
因此,如果你想从左表(tableA)中获取所有行,即使右表(tableB)中没有匹配,你也将使用“左连接”。
如果想从右表(tableB)获取所有行,即使左表(tableA)中没有匹配项,也将使用右连接。
因此,下面的查询与上面使用的查询是等价的。
select fields
from tableB
right join tableA on tableB.key = tableA.key
表从你正在采取的数据是'左'。
您正在加入的表是“正确的”。
LEFT 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
select *
从表1
左连接Table2到Table1。id = Table2.id
在第一个查询中,左连接比较左侧表table1和右侧表table2。
在Which中,table1的所有属性都将被显示,而在table2中,只有条件为真的属性才会被显示。
select *
从表二
在Table1上右连接Table1。id = Table2.id
在第一个查询中,右连接比较右边的表table1和左边的表table2。
在Which中,table1的所有属性都将被显示,而在table2中,只有条件为真的属性才会被显示。
这两个查询将给出相同的结果,因为在查询中表声明的顺序是不同的,比如在第一个左连接查询中分别在左右声明table1和table2,在第二个右连接查询中也分别在左右声明table1和table2。
这就是为什么在两个查询中得到相同结果的原因。如果你想要不同的结果,那就分别执行这两个查询,
select *
从表1
左连接Table2到Table1。id = Table2.id
select *
从表1
右连接Table2到Table1。id = Table2.id