有時你可能需要取得位於同一個資料表中的相關資料。為此,你可以使用一種特殊的聯結,稱為自我聯結(Self Join)。在今天的文章中,我們將學習如何使用 Navicat Premium 作為資料庫用戶端撰寫包含自我聯結的查詢。
語法
自我聯結的基本語法如下:
SELECT a.column_name, b.column_name...
FROM table1 a, table1 b
WHERE a.common_field = b.common_field;
除了通用欄位的連結之外,WHERE 子句還可以根據你的特定需求包含其他運算式。
例子
在 Sakila 範例資料庫中,有一個 customer 資料表,其中包含與客戶相關的資訊,例如他們的姓名、電郵和地址。以下是 Navicat 資料表設計器中的欄:

我們可以使用自我聯結來擷取姓氏與其他客戶的名字對應的所有客戶。我們透過為 customer 資料表指派別名來達到目標。別名允許我們將資料表聯結至它本身,因為它們為資料表提供了兩個唯一的名稱,這意味著我們可以當它們是兩個不同的資料表進行查詢。然後以 last_name 和 first_name 欄位將它們聯結:
SELECT
c1.customer_id as customer_1_id,
c1.first_name as customer_1_first_name,
c1.last_name as customer_1_last_name,
c2.customer_id as customer_2_id,
c2.first_name as customer_2_first_name,
c2.last_name
FROM customer c1,
customer c2
WHERE c1.last_name = c2.first_name
ORDER BY c1.last_name;
Navicat 的自動完成功能在撰寫查詢時非常有用,因為它有助於避免拼寫錯誤並猜測欄名稱。因此,它對於選取欄位特別有用:

執行查詢會產生以下結果:

使用 INNER JOIN
將資料聯結至它本身的另一種方法是使用 INNER JOIN。如果你不確定如何做到這一點,Navicat 可以幫助你!它提供了一個名稱為「查詢建立工具」的有用工具,用於以視覺化方式構建查詢。它允許你在不太了解 SQL 的情況下建立和編輯查詢。資料庫物件顯示在左邊窗格中。而在右邊窗格分為兩部分:上面的「圖表設計」窗格和下面的「語法」窗格。
我們只需將第一個資料表別名的 last_name 欄位拖曳至第二個資料表別名的 first_name,查詢建立工具就會為我們產生聯結!

這是產生的 SQL 語句:
SELECT
c1.customer_id AS customer_1_id,
c1.first_name AS customer_1_first_name,
c1.last_name AS customer_1_last_name,
c2.customer_id AS customer_2_id,
c2.first_name AS customer_2_first_name,
c2.last_name
FROM
customer AS c1
INNER JOIN customer AS c2 ON c1.last_name = c2.first_name
ORDER BY
customer_1_last_name ASC
;
總結
在今天的文章中,我們學習了如何使用 Navicat Premium 撰寫包含自我聯結的查詢。請嘗試 Navicat Premium。你可以完全免費試用它 14 天!