1. 程式人生 > >SQL Server Join 聯接和笛卡爾積問題

SQL Server Join 聯接和笛卡爾積問題

一、(多表)連線方式分類

     T-SQL提供兩種連線方式:傳統方式和SQL連線方式

      1.傳統方式:

            SELECT 列1,列2,列3.... FROM  表1,表2,表3... WHERE condition

            這種方式會把表1,2,3做笛卡爾積(根據測試結果推測,不一定準確)

      2.SQL連線方式:

            1>.INNER JOIN,內聯,系統預設,相當於JOIN 。返回多表之間完全匹配的結果。

            2>.LETF JOIN ,左聯,返回除了有完全匹配的結果還有左表所有行。

            3>.RIGHT JOIN ,右聯,返回除了有完全匹配的結果還有右表所有行。

            4>.Full JOIN ,完全外連結,返回除了有完全匹配的結果還有左右表所有行。

                其中LETF JOIN、RIGHT JOIN和Full JOIN 均屬於外連線(OUTER JOIN)

           5>.CROSS JOIN,交叉連線,又稱為自然連線,即生成一個笛卡爾積。(應該類似於傳統方式)

二、SQL Server JOIN 內部實現的三種演算法:

    1. Loop join(巢狀迴圈),   即首先遍歷 A,將A表中的每一條記錄與 B表進行連線比較,如果滿足A.di=B.id,則返回記錄;
    2. Merge join(合併連線), 即首先對A,B表進行排序,然後同時遍歷A和B表,進行A.id=B.id的驗證,直到遍歷到A和B表結束;
    3. Hash join(雜湊連線), 即首先對A表所有記錄的id進行hash計算,最終形成一個hash表,然後join時,遍歷B表,對B表每條記錄的id進行hash運算,然後在A的Hash表中驗證是否一致,最後得出結果。