Pan*_*wal 218 sql sql-server join left-join right-join
我知道SQL Server中的连接.
例如.Table1,Table2有两个表.
他们的桌子结构如下.
create table Table1 (id int, Name varchar (10))
create table Table2 (id int, Name varchar (10))
Run Code Online (Sandbox Code Playgroud)
表1数据如下:
Id Name
-------------
1 A
2 B
Run Code Online (Sandbox Code Playgroud)
表2数据如下:
Id Name
-------------
1 A
2 B
3 C
Run Code Online (Sandbox Code Playgroud)
如果我执行下面提到的两个SQL语句,则两个输出都是相同的
select *
from Table1
left join Table2 on Table1.id = Table2.id
select *
from Table2
right join Table1 on Table1.id = Table2.id
Run Code Online (Sandbox Code Playgroud)
请解释上述SQL语句中左右连接的区别.
Daa*_*mer 1005
Codeproject有这个图片,它解释了SQL连接的简单基础知识,取自:http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx
Pét*_*rök 72
Select * from Table1 left join Table2 ...
Run Code Online (Sandbox Code Playgroud)
和
Select * from Table2 right join Table1 ...
Run Code Online (Sandbox Code Playgroud)
确实是完全可以互换的.然而,尝试Table2 left join Table1
(或其相同的一对Table1 right join Table2
)看到差异.此查询应该为您提供更多行,因为Table2包含一个id为Table1中不存在的行.
小智 37
您从中获取数据的表是"LEFT".
您加入的表格是'正确'.
LEFT JOIN:从左表中获取所有项目并且(仅)从右表中匹配项目.
RIGHT JOIN:从右表中获取所有项目并且(仅)从左表中匹配项目.
所以:
Select * from Table1 left join Table2 on Table1.id = Table2.id
Run Code Online (Sandbox Code Playgroud)
得到:
Id Name
-------------
1 A
2 B
Run Code Online (Sandbox Code Playgroud)
但:
Select * from Table1 right join Table2 on Table1.id = Table2.id
Run Code Online (Sandbox Code Playgroud)
得到:
Id Name
-------------
1 A
2 B
3 C
Run Code Online (Sandbox Code Playgroud)
你是正确的连接表,桌面上的行数越少,行数越多
,
再次连接表,表中行数越少,行数越多,
尝试:
If Table1.Rows.Count > Table2.Rows.Count Then
' Left Join
Else
' Right Join
End If
Run Code Online (Sandbox Code Playgroud)
小智 19
(内部)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
Run Code Online (Sandbox Code Playgroud)
表B.
id2 place
_____________
1 Nepal
2 USA
3 Lumbini
5 Kathmandu
Run Code Online (Sandbox Code Playgroud)
内部联接
注意:它给出了两个表的交集.
句法
SELECT column_name FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;
Run Code Online (Sandbox Code Playgroud)
将其应用于您的样本表:
SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA INNER JOIN TableB ON TableA.id = TableB.id2;
Run Code Online (Sandbox Code Playgroud)
结果将是:
firstName lastName Place
_____________________________________
Ram Thapa Nepal
sam Koirala USA
abc xyz Lumbini
Run Code Online (Sandbox Code Playgroud)
左加入
注意:将给出TableA中的所有选定行,以及TableB中任何常见的选定行.
SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name = table2.column_name;
Run Code Online (Sandbox Code Playgroud)
将其应用于您的样本表中
SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA LEFT JOIN TableB ON TableA.id = TableB.id2;
Run Code Online (Sandbox Code Playgroud)
结果将是:
firstName lastName Place
______________________________
Ram Thapa Nepal
sam Koirala USA
abc xyz Lumbini
sruthy abc Null
Run Code Online (Sandbox Code Playgroud)
正确加入
注意:将给出TableB中的所有选定行,以及TableA中任何常见的选定行.
句法:
SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.column_name = table2.column_name;
Run Code Online (Sandbox Code Playgroud)
将它应用到你的samole表中:
SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA RIGHT JOIN TableB ON TableA.id = TableB.id2;
Run Code Online (Sandbox Code Playgroud)
结果将是bw:
firstName lastName Place
______________________________
Ram Thapa Nepal
sam Koirala USA
abc xyz Lumbini
Null Null Kathmandu
Run Code Online (Sandbox Code Playgroud)
完全加入
注意:它与union操作相同,它将返回两个表中的所有选定值.
句法:
SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;
Run Code Online (Sandbox Code Playgroud)
将它应用到你的样本表中:
SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA FULL JOIN TableB ON TableA.id = TableB.id2;
Run Code Online (Sandbox Code Playgroud)
结果将是:
firstName lastName Place
______________________________
Ram Thapa Nepal
sam Koirala USA
abc xyz Lumbini
sruthy abc Null
Null Null Kathmandu
Run Code Online (Sandbox Code Playgroud)
一些事实
对于INNER加入,订单无关紧要
对于(LEFT,RIGHT或FULL)OUTER连接,顺序很重要
在w3schools找到更多
小智 12
select fields
from tableA --left
left join tableB --right
on tableA.key = tableB.key
Run Code Online (Sandbox Code Playgroud)
from
此示例中的表位于tableA
关系的左侧.
tableA <- tableB
[left]------[right]
Run Code Online (Sandbox Code Playgroud)
因此,如果您想从左表(tableA
)中获取所有行,即使右表(tableB
)中没有匹配项,您也将使用"左连接".
如果你想从右表(tableB
)中获取所有行,即使左表(tableA
)中没有匹配项,你也会使用right join
.
因此,以下查询等同于上面使用的查询.
select fields
from tableB
right join tableA on tableB.key = tableA.key
Run Code Online (Sandbox Code Playgroud)
one*_*hen 10
你似乎在问,"如果我可以重写一个RIGHT OUTER JOIN
使用LEFT OUTER JOIN
语法,那为什么要有一个RIGHT OUTER JOIN
语法呢?" 我认为这个问题的答案是,因为该语言的设计者不想对用户施加这样的限制(我认为如果他们这样做会受到批评),这将迫使用户改变表的顺序在FROM
某些情况下仅在更改连接类型时的子句中.
你的两个陈述是等价的.
大多数人只使用LEFT JOIN
它,因为它看起来更直观,而且它是通用语法 - 我不认为所有RDBMS都支持RIGHT JOIN
.
归档时间: |
|
查看次数: |
290417 次 |
最近记录: |