SQL表結合的方法

   今天來談一下SQL中除了join之外的多表結合方法:

UNION / UNION ALL

  • UNIONUNION ALL 用於合併兩個或多個查詢的結果,通常用來合併來自不同表格但具有相同欄位的資料。
  • UNION 會自動去除重複的資料,而 UNION ALL 會保留所有的資料(包括重複的)。
  • 差別JOIN 將兩個表的資料基於指定欄位進行橫向結合(並列行),而 UNION 將兩個表的結果垂直合併(串接行)。UNION 要求欄位數量和數據類型相同,而 JOIN 則不需要。

  • 效能UNION 會去除重複行(去重過程耗時),而 UNION ALL 不去重,效能會比 UNION 好。相比之下,JOIN 更適合用於需要關聯性的情況,而 UNION 適合用於不相關的多組結果的合併。

  • 語法範例:
     SELECT column1, column2 FROM table1
     UNION
     SELECT column1, column2 FROM table2;

CROSS JOIN

  • CROSS JOIN 會產生兩個表的「笛卡爾積」,即將兩個表的每一筆資料互相組合,結果數量是兩表記錄數量的乘積。
  • 適用於需要獲取所有可能組合的情況。
  • 差別CROSS JOIN 是笛卡爾積,沒有條件的匹配,即每一行與另一表的所有行組合。JOIN 通常有條件限制,適用於關聯查詢。

  • 效能CROSS JOIN 結果集非常龐大,通常比 JOIN 慢,且適合僅需所有可能組合的情況。在實際應用中不常用。

  • 語法範例:
     SELECT * FROM table1
     CROSS JOIN table2;

NATURAL JOIN

  • NATURAL JOIN 會自動基於兩個表中相同名稱的欄位進行連接,因此不需要明確指定欄位。
  • 不過它容易出現意外的結果,因為如果兩表有不希望作為連接基礎的相同欄位,結果可能不符合預期。
  • 差別NATURAL JOIN 自動基於相同名稱的欄位進行連接,而 JOIN 要明確指定匹配條件。

  • 效能NATURAL JOIN 和普通的 JOIN 沒有明顯效能差別,但 NATURAL JOIN 可能會因為表中意外的相同欄位而產生不正確的結果,增加了潛在的除錯成本。

  • 語法範例:
     SELECT * FROM table1
     NATURAL JOIN table2;

APPLY(CROSS APPLY 和 OUTER APPLY)

  • APPLY 是 SQL Server 特有的語法,用於將左側表的每一行與右側的子查詢結果結合。CROSS APPLY 僅返回匹配的結果,OUTER APPLY 則保留左側表的所有行。
  • 對於一些需要多對一的查詢(例如返回每個客戶的最新訂單),APPLY 特別有用。
  • 差別APPLY 用於每一行執行右側的子查詢,適合對每一行做特定查詢。JOIN 則一次性處理整個表,效率上有差別。

  • 效能APPLY 通常比 JOIN 慢,因為會對每一行進行查詢,尤其是 OUTER APPLY 保留了左側表的所有行,但在一些情況下可以簡化查詢邏輯。

  • 語法範例:
     SELECT * FROM table1 t1
     CROSS APPLY (SELECT TOP 1 * FROM table2 t2 WHERE t1.id = t2.id ORDER BY t2.date DESC) AS t2_latest;

子查詢(Subquery)或派生表(Derived Table)

  • 可以使用子查詢將一個表的查詢結果作為另一個查詢的一部分,這種方式可以間接地將表進行結合。
  • 派生表也可以用於暫時建立查詢結果的表,供外層查詢使用。
  • 差別:子查詢是在查詢內嵌套另一查詢,適合在單表中先過濾或轉換數據。JOIN 對多表查詢更有效。

  • 效能:子查詢通常比 JOIN 慢,因為可能重複計算。當需要多表連接並取結果時,JOIN 更優化。

  • 語法範例:
     SELECT t1.column1, subquery.column2
     FROM table1 t1,
         (SELECT column2 FROM table2 WHERE condition) AS subquery
     WHERE t1.id = subquery.id;

CTE(Common Table Expression)

  • CTE 是一種可以讓查詢更具可讀性的方式,適合處理多表查詢和遞迴查詢。
  • 可以先用 CTE 定義查詢結果,再在後續的查詢中結合其他表。
  • 差別:CTE 是臨時命名的結果集,在查詢中使用 WITH 來定義,可以簡化多層查詢。JOIN 直接連接表。

  • 效能:CTE 與 JOIN 的效能差別較小,但 CTE 能提升複雜查詢的可讀性。對於大表或多次遞迴,CTE 的效能可能略差。

  • 語法範例:
     WITH CTE AS (    
     SELECT column1, column2 FROM table1    
     )    
     SELECT CTE.column1, table2.column3   
     FROM CTE    
     JOIN table2 ON CTE.column2 = table2.column2;





方法 描述 效能考量 適用情境
JOIN 將兩表基於指定欄位進行橫向結合 快速,適合大部分情況 多表關聯查詢,最常見的多表結合方式
UNION / UNION ALL 合併多表結果,串接行,UNION 去重 UNION ALL 比 UNION 更高效 合併多表結果且字段相同,適合匯總不相關的數據
CROSS JOIN 生成兩表的笛卡爾積,不使用條件 效能較差,結果集龐大 需要所有可能的組合情況(如產品和分類的組合)
NATURAL JOIN 自動基於同名欄位進行結合 需注意欄位匹配,效能與 JOIN 相似 有相同欄位名稱的簡單表結合,不建議複雜查詢
APPLY (CROSS/OUTER) 每行執行右側子查詢,適合行對行的查詢 較慢,對每行執行一次右側子查詢 返回每行對應的多結果(如每位員工的最新訂單)
子查詢 將結果嵌入另一查詢中,適合單表操作或過濾 效能相對較低,特別是嵌套查詢 單表操作或需要先過濾的查詢,不適合大量數據連接
CTE (Common Table Expression) 臨時命名查詢結果集,多層查詢更清晰 可讀性高,效能略低於 JOIN 複雜查詢、多層次查詢,適合多表的邏輯處理

留言

熱門文章