236

我知道 SQL Server 中的连接。

例如。有两个表Table1,Table2。

它们的表结构如下。

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 语句中左连接和右连接的区别。

4

9 回答 9

77
Select * from Table1 left join Table2 ...

Select * from Table2 right join Table1 ...

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

于 2011-01-17T16:59:08.060 回答
44

您从中获取数据的表是“左”。
您要加入的表是“正确的”。
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  
于 2013-10-22T13:39:04.423 回答
40

(INNER) JOIN:返回两个表中具有匹配值的记录。

LEFT (OUTER) JOIN:从左表返回所有记录,从右表返回匹配的记录。

RIGHT (OUTER) JOIN:从右表返回所有记录,从左表返回匹配的记录。

FULL (OUTER) JOIN:当左表或右表匹配时返回所有记录

例如,假设我们有两个包含以下记录的表:

表 A

id   firstname   lastname
___________________________
1     Ram         Thapa
2     sam         Koirala
3     abc         xyz
6    sruthy       abc

表 B

id2   place
_____________
1      Nepal
2      USA
3      Lumbini
5      Kathmandu

内部联接

注意:它给出了两个表的交集。

内部联接

句法

SELECT column_name FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;

将其应用到您的示例表中:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA INNER JOIN TableB ON TableA.id = TableB.id2;

结果将是:

firstName       lastName       Place
_____________________________________
  Ram         Thapa             Nepal
  sam         Koirala            USA
  abc         xyz              Lumbini

左连接

注意:将给出 TableA 中的所有选定行,以及 TableB 中任何常见的选定行。

左连接

SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name = table2.column_name;

将其应用到您的示例表中

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA LEFT JOIN TableB ON TableA.id = TableB.id2;

结果将是:

firstName   lastName    Place
______________________________
 Ram         Thapa      Nepal
 sam         Koirala    USA
 abc         xyz        Lumbini
sruthy       abc        Null

右连接

注意:将给出 TableB 中所有选定的行,以及 TableA 中任何常见的选定行。

右连接

句法:

SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.column_name = table2.column_name;

将其应用到您的 samole 表中:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA RIGHT JOIN TableB ON TableA.id = TableB.id2;

结果将 bw:

firstName   lastName     Place
______________________________
Ram         Thapa         Nepal
sam         Koirala       USA
abc         xyz           Lumbini
Null        Null          Kathmandu

完全加入

注意:它与联合操作相同,它将从两个表中返回所有选定的值。

完全加入

句法:

SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;

将其应用于您的示例 [le 表:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA FULL JOIN TableB ON TableA.id = TableB.id2;

结果将是:

firstName   lastName    Place
______________________________
 Ram         Thapa      Nepal
 sam         Koirala    USA
 abc         xyz        Lumbini
sruthy       abc        Null
 Null         Null      Kathmandu

一些事实

对于 INNER 加入,顺序无关紧要

对于(LEFT、RIGHT 或 FULL)OUTER 连接,顺序很重要

在w3schools找到更多信息

于 2017-11-13T09:47:18.763 回答
12
select fields 
from tableA --left
left join tableB --right
on tableA.key = tableB.key

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

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

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

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

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

select fields
from tableB 
right join tableA on tableB.key = tableA.key
于 2013-05-13T14:49:58.640 回答
11

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

于 2011-01-18T11:06:46.617 回答
9

你的两个陈述是等价的。

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

于 2011-01-17T16:57:36.180 回答
0

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中仅显示条件为真的那些属性。

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

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

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

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

于 2017-10-17T10:44:57.093 回答
0

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 在两个表中都很常见,因此结果中您将有四列,其中依次来自第一个第二个表的idname列。

*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 和列中获取所有记录(行),并从表 1 和表 2 中匹配id,从表 2 中获取。(请记住,这是一个右连接,所以表 2 中的所有列而不是从表 1 将被考虑)。

于 2018-02-14T18:54:39.090 回答
0

我觉得我们可能需要在最后一个数字的子句中使用AND条件,以便我们得到所需的结果。我觉得查询需要更新为whereOuter Excluding JOINA 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

于 2016-06-21T22:24:23.713 回答