SELECT * FROM 銷貨單表頭 A INNER JOIN 客戶主檔 B ON A.客戶編號 = B.客戶編號;
2. LEFT OUTER JOIN
保障左邊所有資料一定要出現(右邊無對應則補 NULL)
SELECT * FROM 銷貨單表頭 A LEFT OUTER JOIN 客戶主檔 B ON A.客戶編號 = B.客戶編號;
3. RIGHT OUTER JOIN
保障右邊所有資料一定要出現(左邊無對應則補 NULL)
SELECT * FROM 銷貨單表頭 A RIGHT OUTER JOIN 客戶主檔 B ON A.客戶編號 = B.客戶編號;
4. FULL OUTER JOIN
保障兩邊所有資料一定要出現(無對應者補 NULL)
SELECT * FROM 銷貨單表頭 A FULL OUTER JOIN 客戶主檔 B ON A.客戶編號 = B.客戶編號;
5. CROSS JOIN
交叉連接(笛卡兒積,左邊筆數 × 右邊筆數)
SELECT * FROM 銷貨單表頭 A CROSS JOIN 客戶主檔 B;
資料表範例
使用 商品基本資料表(Product) 關聯 存放 地點主檔資料表(Place)
一對多的關係,Product 是交易檔, Place 是主檔
SQL
-- 查詢存放地點資料表 PlacesSELECT PlaceNo , PlaceName FROM Places ORDER BY PlaceNo-- 查詢商品資料表 ProductsSELECT ProductNo , ProductName , ProductSpec , PlaceNo FROM ProductsORDER BY ProductNo
【結果】
【說明】
如圖,針對兩個資料表都有找不到的資料。
在商品資料表中的 PlaceNo = 4,是沒有任何一地點編號是 04。
沒有任一個Product商品是放在 低溫 地點的。
交易檔是商品資料表(因可重複),主檔是 存放地點,交易檔放左邊,主檔放右邊。
【步驟】
產生交易資料: 商品基本資料
SQL
SELECT A.ProductNo , A.ProductName , A.ProductSpec , A.PlaceNoFROM Products AS AORDER BY A.ProductNo
SELECT A.ProductNo , A.ProductName , A.ProductSpec , A.PlaceNo, B.PlaceNameFROM Products AS A INNER JOIN Places AS B ON B.PlaceNo = A.PlaceNoORDER BY A.ProductNo-- 查詢商品資料表 ProductsSELECT ProductNo , ProductName , ProductSpec , PlaceNo FROM ProductsORDER BY ProductNo
【解決】
改用OUTER JOIN,因它有方向性,要保障完整交易紀錄(在左側),就得使用 LEFT OUTER JOIN。
SQL
SELECT A.ProductNo , A.ProductName , A.ProductSpec , A.PlaceNo, B.PlaceNameFROM Products AS A LEFT OUTER JOIN Places AS B ON B.PlaceNo = A.PlaceNoORDER BY A.ProductNo-- 查詢商品資料表 ProductsSELECT ProductNo , ProductName , ProductSpec , PlaceNo FROM ProductsORDER BY ProductNo
SELECT A.ProductNo , A.ProductName , A.ProductSpec , A.PlaceNo, B.PlaceNameFROM Products AS A FULL OUTER JOIN Places AS B ON B.PlaceNo = A.PlaceNoORDER BY A.ProductNo-- 查詢商品資料表 ProductsSELECT ProductNo , ProductName , ProductSpec , PlaceNo FROM ProductsORDER BY ProductNo
SELECT Products.ProductNo , Products.ProductName , Products.ProductSpec, Products.PlaceNo, Places.PlaceNameFROM Products FULL OUTER JOIN PlacesON Places.PlaceNo = Products.PlaceNoWHERE Products.PlaceNo IS NULL OR Places.PlaceNo IS NULLORDER BY Products.ProductNo
【結果】
找中間那塊,兩邊資料表都找不到的,都是PlaceName = NULL
CROSS JOIN
取得商品基本資料表所有的資料列對照每一筆存放地點的資料列的資料集合。
等同沒有 JOIN,沒有設關聯,結果會是 左邊資料 x 右邊資料