適用於:SQL Server
即使數據表在資料庫中沒有反射關聯性,您也可以將數據表聯結至本身。 例如,您可以使用自我連接來尋找居住在同一個城市的作者的配對。
如同任何聯結,自我聯結至少需要兩個數據表。 差別在於,您不需要將第二個數據表新增至查詢,而是新增相同數據表的第二個實例。 如此一來,您就可以比較數據表第一個實例中的數據行與第二個實例中的相同數據行,這可讓您比較數據行中的值彼此。 查詢和檢視表設計工具 將別名指派給數據表的第二個實例。
例如,如果您要建立自我聯結來尋找 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 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 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 authors1
ON authors.city
= authors1.city
AND authors.au_id
< authors1.au_id
WHERE
authors.city = 'Berkeley'
結果集合看起來像這樣:
Cheryl Carson Abraham Bennet
手動建立自我聯結
將您要處理的數據表或數據表值物件新增到[圖表]窗格。
再次新增相同的數據表,讓 [圖表] 窗格在 [圖表] 窗格中顯示相同的數據表或數據表值物件兩次。
查詢和檢視表設計工具會在數據表名稱後加上序號,以此將別名指派給第二個實例。 此外,查詢和檢視表設計工具會在 [圖表] 窗格內的兩個數據表或數據表值對象之間建立聯結線。
以滑鼠右鍵點擊連結線,然後從快捷方式選單中選擇 [屬性]。
在 [屬性] 視窗中,按一下 [聯結條件],輸入,然後按一下屬性右側的 省略號(...)。
在 [聯結] 對話框中,視需要變更主鍵之間的比較運算符。 例如,您可以將 運算子變更為小於 (<)。
建立額外的聯結條件(例如,authors.zip = authors1.zip),方法是將首次出現的資料表或資料表值物件中的主要聯結字段名稱拖曳並放置到第二次出現中的對應字段上。
指定查詢的其他選項,例如輸出數據行、搜尋條件和排序順序。