共用方式為


手動建立自我聯結 (Visual Database Tools)

適用於:SQL Server

即使數據表在資料庫中沒有反射關聯性,您也可以將數據表聯結至本身。 例如,您可以使用自我連接來尋找居住在同一個城市的作者的配對。

如同任何聯結,自我聯結至少需要兩個數據表。 差別在於,您不需要將第二個數據表新增至查詢,而是新增相同數據表的第二個實例。 如此一來,您就可以比較數據表第一個實例中的數據行與第二個實例中的相同數據行,這可讓您比較數據行中的值彼此。 查詢和檢視設計工具 (Visual Database Tools) 會將別名指派給數據表的第二個實例。

例如,如果您要建立自我聯結來尋找 Berkeley 內的所有作者組,您會比較 city 數據表 city 第一個實例中的數據行與第二個實例中的數據行。 產生的查詢看起來可能如下所示:

SELECT authors.au_fname,
       authors.au_lname,
       authors1.au_fname AS Expr2,
       authors1.au_lname AS Expr3
FROM authors
     INNER JOIN authors AS authors1
         ON authors.city = authors1.city
WHERE authors.city = 'Berkeley';

建立自我聯結通常需要多個聯結條件。 若要瞭解原因,請考慮上述查詢的結果:

Cheryl Carson       Cheryl Carson
Abraham Bennet      Abraham Bennet
Cheryl Carson       Abraham Bennet
Abraham Bennet      Cheryl Carson

第一個數據列是無用的;它表明謝麗爾·卡森住在與謝麗爾·卡森相同的城市。 第二個數據列同樣無用。 若要消除這個無用的數據,您可以新增另一個條件,只保留兩個作者名稱描述不同作者的結果數據列。 產生的查詢看起來可能像這樣:

SELECT authors.au_fname,
       authors.au_lname,
       authors1.au_fname AS Expr2,
       authors1.au_lname AS Expr3
FROM authors
     INNER JOIN authors AS authors1
         ON authors.city = authors1.city
        AND authors.au_id <> authors1.au_id
WHERE authors.city = 'Berkeley';

結果集已改善:

Cheryl Carson       Abraham Bennet
Abraham Bennet      Cheryl Carson

但兩個結果數據列是多餘的。 第一個說卡森住在與貝內特相同的城市,第二個說貝內特住在與卡森相同的城市。 若要消除此備援,您可以將第二個聯結條件從「不等於」變更為「小於」。產生的查詢看起來可能像這樣:

SELECT authors.au_fname,
       authors.au_lname,
       authors1.au_fname AS Expr2,
       authors1.au_lname AS Expr3
FROM authors
     INNER JOIN authors AS authors1
         ON authors.city = authors1.city
        AND authors.au_id < authors1.au_id
WHERE authors.city = 'Berkeley';

結果集合看起來像這樣:

Cheryl Carson       Abraham Bennet

手動建立自我聯結

  1. 將 新增至 [ 圖表] 窗格 (Visual Database Tools) 您想要處理的數據表或數據表值物件。

  2. 再次新增相同的數據表,讓 [圖表] 窗格在 [圖表] 窗格中顯示相同的數據表或數據表值物件兩次。

    查詢和檢視表設計工具會在數據表名稱後加上序號,以此將別名指派給第二個實例。 此外,查詢和檢視表設計工具會在 [圖表] 窗格內的兩個數據表或數據表值對象之間建立聯結線。

  3. 以滑鼠右鍵點擊連結線,然後從快捷方式選單中選擇 [屬性]

  4. 在 [屬性] 視窗中,選取 [聯結條件] 和 [類型],然後選取屬性右邊的省略號 (...)。

  5. 在 [聯結] 對話框中,視需要變更主鍵之間的比較運算符。 例如,您可以將 運算子變更為小於 (<)。

  6. 建立額外的聯結條件(例如,authors.zip = authors1.zip),方法是將首次出現的資料表或資料表值物件中的主要聯結字段名稱拖曳並放置到第二次出現中的對應字段上。

  7. 指定查詢的其他選項,例如輸出數據行、搜尋條件和排序順序。