2010-06-11 62 views

回答

0

內部連接不會在連接目標字段中帶來任何空值。如果沒有匹配的記錄,則原件不在表格中。

+1

當沒有匹配時,外部連接返回空值 – 2010-06-11 12:53:25

2

即使在另一個表中沒有匹配的行,完全連接也會從兩個表中返回行。完全連接就像一個正確的連接和一個左連接。內部聯接將只返回在另一個表中至少有一個夥伴的行。

0

這意味着您的表格匹配得相當好。

維基頁面找到here顯示了他們如何工作的一個很好的例子。

58

A FULL OUTER JOINLEFT OUTER JOINRIGHT OUTER JOIN的聯合。

(?這樣做是否有意義)

描述不錯的視覺解釋聯接(左下介紹全外連接): http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins

參考:codeproject

+6

引用源代碼?看起來像http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins – 2014-06-18 02:39:48

+0

它已經有一段時間了,它可能是你引用的codeproject。 – 2014-06-19 11:39:42

+0

好的,我檢查過了,它是M.L Moffat的博客帖子,我必須找到它。 – 2015-08-20 14:40:59

3

所不同的是無與倫比的行爲行。

例如,如果表A中有一行在定義了連接的字段中的表B中沒有對應關係,那麼內部聯接將完全省略該行,而完全聯接將包含該行,但對於表B的字段具有NULL值。Viceversa對於不匹配的表B行。

0

考慮表A和表B

表A - (密鑰,名稱)

1,數據1 2,數據2 4,數據4 5,DATA5

表B - (鍵,的Fkey,名稱)

1,1,DataA的 2,2,數據B 3,NULL,DATAC 4,4,DataD

內連接將返回

  • 1,數據1,1,1,DataA的
  • 2,數據2,2,2,數據B
  • 4,數據3,4,4,DataD

而一個完全外部聯接將返回

  • 1,數據1,1,1,DataA的
  • 2,數據2,2,2,數據B
  • NULL,NULL,3,NULL,DATAC
  • 4,數據4,4,4,DataD
  • 5,DATA5,NULL,NULL,NULL
115

注意所有這些可以在維基百科找到:Join (SQL)

有三種類型的外部聯接:

  • LEFT OUTER JOIN
  • RIGHT OUTER JOIN
  • FULL OUTER JOIN

關鍵字OUTER是在下面的所有實現可選標準,所以FULL JOIN與FULL OUTER JOIN相同。 (我在這個答覆的其餘部分中刪除了來自SQL的OUTER。)

讓我們來看看它們各自的作用。

考慮以下兩個輸入數據集:

Set "A" Set "B" 

AA   BB 
-------- -------- 
Item 1  Item 3 
Item 2  Item 4 
Item 3  Item 5 
Item 4  Item 6 

注意,有所述的一些項目不在B,反之亦然。

現在,如果我們這樣寫的SQL語句,使用LEFT JOIN:

SELECT * FROM A LEFT JOIN B ON AA = BB 

你會得到以下結果(空孔實際上NULL馬克):

AA   BB 
-------- -------- 
Item 1 
Item 2 
Item 3  Item 3 
Item 4  Item 4 

注意你會得到所有的來自AA的行,或者更確切地說,全部是來自的行左邊的連接子句的一部分。

如果您切換到使用右連接:您從連接語句的右側部分中的所有行獲得

SELECT * FROM A RIGHT JOIN B ON AA = BB 

AA   BB 
-------- -------- 
Item 3  Item 3 
Item 4  Item 4 
      Item 5 
      Item 6 

通知。

但是,如果你想兩者都行,你會使用完全聯接:

SELECT * FROM A FULL JOIN B ON AA = BB 

AA   BB 
-------- -------- 
Item 1   <-----+ 
Item 2     | 
Item 3  Item 3  | 
Item 4  Item 4  | 
      Item 5  +--- empty holes are NULL's 
      Item 6  | 
^     | 
    |      | 
    +---------------------+ 

正如評論所說,讓我完成了其他不同的方式加入。

隨着內部聯接:

SELECT * FROM A INNER JOIN B ON AA = BB 

AA   BB 
-------- -------- 
Item 3  Item 3 
Item 4  Item 4 

有內加入我們只得到實際匹配的行,沒有因爲加入的孔。

交叉連接生成笛卡爾積,通過從第一組的每一行從第二組匹配了每一行:

SELECT * FROM A CROSS JOIN B 

AA   BB 
-------- -------- 
Item 1  Item 3 ^
Item 1  Item 4  +--- first item from A, repeated for all items of B 
Item 1  Item 5  | 
Item 1  Item 6  v 
Item 2  Item 3 ^
Item 2  Item 4  +--- second item from A, repeated for all items of B 
Item 2  Item 5  | 
Item 2  Item 6  v 
Item 3  Item 3  ... and so on 
Item 3  Item 4 
Item 3  Item 5 
Item 3  Item 6 
Item 4  Item 3 
Item 4  Item 4 
Item 4  Item 5 
Item 4  Item 6 

還要注意的是,我們沒有指定匹配的列,因爲沒有匹配完成。

最後,NATURAL連接,在這種語法中,我們不指定哪些列匹配,但匹配列名。在我們人爲的例子,沒有列名是相同的,但是我們要說的這個具體的例子,列名是XX兩個表中,那麼我們將得到以下結果:

SELECT * FROM A NATURAL JOIN B 

+----------+------- matches on the names, and then the data 
|   | 
v   v 
XX   XX 
-------- -------- 
Item 3  Item 3 
Item 4  Item 4 

正如你所看到的,你與INNER連接相同,但不必輸入連接子句的匹配部分。

+0

@polygenelubricants - 是的,但這不是** OUTER **連接的類型。 – tster 2010-06-11 12:52:28

+0

真的很棒的解釋。你能否以同樣的方式在sql server中解釋「CROSS APPLY」? – hemanth 2014-02-28 04:56:02

+0

我認爲APPLY運算符需要他們自己的問題。 – 2014-02-28 06:12:35

2

在一個非常簡單的方式,主要區別是:

INNER JOIN - 只返回匹配的行。因此,不包括不匹配的行。

FULL JOIN - 返回存在於右表,而不是在左側存在於左表而不是在正確的行,加行,越過內加入行。