使用 JOIN 查詢

來源1 來源2

DECLARE @TableA table( id int, name nvarchar(20) )

DECLARE @TableB table( id int, name nvarchar(20) )

insert @TableA values (1,'A'),(2,'B'),(3,'C'),(4,'D')

insert @TableB values (1,'E'),(2,'B'),(3,'F'),(4,'C')

 

select * from @TableA

select * from @TableB

--產生是AB的交集的資料列

SELECT * FROM @TableA t1 INNER JOIN @TableB t2 ON t1.name = t2.name

 

--FULL JOIN 即為 LEFT JOIN(A) RIGHT JOIN(B) 的聯集。 有時候也可以利用它來找尋不相匹配的資料,則會以null做為值。

SELECT * FROM @TableA t1 FULL OUTER JOIN @TableB t2 ON t1.name = t2.name


--Left outer join 產生表A的完全集,而B表中匹配的則有值,沒有匹配的則以null值取代

SELECT * FROM @TableA t1 LEFT OUTER JOIN @TableB t2 ON t1.name = t2.name

 

--回傳的是右邊資料表中所有資料列,以及另一邊資料表中符合 join 條件中匹配的資料列傳回NULL

SELECT * FROM @TableA t1 RIGHT OUTER JOIN @TableB t2 ON t1.name = t2.name

--WHERE t1.id IS  null

 

--UNION 操作符用於合併兩個或多個 SELECT 語句的結果集

--交叉連接為兩個資料表間的笛卡兒乘積 (Cartesian product),兩個資料表在 Join 時,不能指定任何條件,

--它會回傳兩個資料表中所有欄位可能的排列組合出來,資料很可觀,要小心使用。

--請注意,UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的資料類型。同時,每條 SELECT 語句中的列的順序必須相同。

--UNION 只選取記錄,而UNION ALL會列出所有記錄。

SELECT name FROM @TableA UNION SELECT name FROM @TableB

 

--把表A和表B的資料進行一個N*M的組合,即笛卡爾積

--一般來說,我們很少用到這個語法。但是我們得小心,如果不是使用嵌套的select語句,一般系統都會產生笛卡爾乘積然再做過濾。

--這是對於性能來說是非常危險的,尤其是表很大的時候。

--如果有where的時候,可以使用:

SELECT * FROM @TableA CROSS JOIN @TableB

 

留言