例如,有两个表:

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 * 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和id 2在两个表中都很常见,结果在结果中,你将有四个列,分别是第一个表和第二个表的id和name列。

*选择* 从表1 左连接Table2到Table1。id = Table2.id

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

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

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

其他回答

我觉得我们可以在Outer excluded 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并集B的所有结果

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

Select * from Table1 left join Table2 ...

and

Select * from Table2 right join Table1 ...

是完全可以互换的。但是,尝试Table2左连接Table1(或它的相同对,Table1右连接Table2),看看有什么不同。这个查询应该提供更多的行,因为Table2包含一个id在Table1中不存在的行。

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

表从你正在采取的数据是'左'。 您正在加入的表是“正确的”。 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