two - sql outer join




SQL Server中左連接和右連接的區別 (7)

我知道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語句中左和右連接的區別。



Select * from Table1 t1 Left Join Table2 t2 on t1.id=t2.id定義:左連接選擇表1中的“select”關鍵字和表2中與“on”後面的條件相匹配的列中提到的所有列。關鍵詞。

同樣,根據定義:右連接選擇表2中的“select”關鍵字和表1中與“on”關鍵字之後的條件匹配的列中提到的所有列。

引用你的問題,兩個表中的id都與輸出中需要引用的所有列進行比較。 因此,ids 1和2在這兩個表中都很常見,因此結果是,您將按順序在第一個第二個表中有四個帶有idname列的列。

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

上述表達式將表1和列中的所有記錄(行)與表2和表2中的表1和表2中的匹配的id相比較。

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

與上面的表達式類似,它從表1和列中獲取所有記錄(行),並從表2中獲取與表1和表2匹配的id 。(請記住,這是一個正確的連接,因此表2中的所有列都不是從table1將被考慮)。


(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 table:

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加入訂單並不重要

對於(左,右或全)OUTER加入,訂單事宜

w3schools找到更多


你似乎在問:“如果我可以使用LEFT OUTER JOIN語法重寫一個RIGHT OUTER JOIN那麼為什麼要有一個RIGHT OUTER JOIN語法呢?” 我認為這個問題的答案是,因為該語言的設計者不想對用戶設置這樣的限制(我認為他們會被批評,如果他們這樣做),這會迫使用戶改變表的順序在某些情況下,只改變連接類型的FROM子句。


您正在從中獲取數據的表格是'LEFT'。
你加入的表是'RIGHT'。
左連接:從左表和(僅)匹配右表中的所有項目。
右連接:從右表中選取所有項目,並且(僅)從左表中匹配項目。
所以:

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  

我覺得我們可能需要在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所有結果


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






right-join