摘要:[SQL] EXCEPT 和 INTERSECT 交集與差集
EXCEPT 和INTERSECT (Transact-SQL)語法
用途:比較兩個查詢的結果來傳回相異的資料列
EXCEPT 會從 "左側" 的輸入查詢傳回相異的資料列,而不會從右側之輸入查詢的輸出傳回。
INTERSECT 會傳回左側及右側之輸入查詢所輸出的相異資料列。
傳回INTERSECT 運算子左右兩側之查詢所傳回的任何相異值。
==========注意事項=========
在所有查詢中,資料行的數目和順序都必須相同。
資料類型必須相容。
--DECLARE @Table,宣告一個變數資料表
DECLARE @Employee TABLE
( EmpId Varchar(10),
EmpName Varchar(25),
EmpSalary Numeric(12,0)
)
--Insert sample records,寫入幾筆樣本資料
INSERT INTO @Employee VALUES( 'Emp198', 'Shekar', 2)
INSERT INTO @Employee VALUES( 'Emp202', 'Ravi', 2)
INSERT INTO @Employee VALUES( 'Emp234', 'Karim', 4)
DECLARE @Employee2 TABLE
( EmpId Varchar(10),
EmpName Varchar(25),
EmpSalary Numeric(12,0)
)
--Insert sample records,寫入幾筆樣本資料
INSERT INTO @Employee2 VALUES( 'Emp184', 'John', 2)
INSERT INTO @Employee2 VALUES( 'Emp151', 'Suresh', 3)
INSERT INTO @Employee2 VALUES( 'Emp198', 'Shekar', 2)
--來看看EXCEPT 和INTERSECT (Transact-SQL) 有甚麼不同吧!!!!
SELECT * FROM @Employee
EXCEPT
SELECT * FROM @Employee2
ORDER BY EmpId
--結果只有@Employee 的差異
/*
Emp202 Ravi 2
Emp234 Karim 4
*/
SELECT * FROM @Employee2
EXCEPT
SELECT * FROM @Employee
/*
Emp151 Suresh 3
Emp184 John 2
*/
SELECT * FROM @Employee
INTERSECT
SELECT * FROM @Employee2
--只有相同的部分(怎麼有INNER JOIN 的感覺??)
/*
Emp198 Shekar 2
*/
SELECT * FROM @Employee2
INTERSECT
SELECT * FROM @Employee
ORDER BY EmpId
/*
Emp198 Shekar 2
*/
--取得@Employee跟@Employee2沒有交集的部分資料
SELECT * FROM @Employee
EXCEPT
( SELECT * FROM @Employee
INTERSECT
SELECT * FROM @Employee2
)
UNION
SELECT * FROM @Employee2
EXCEPT
( SELECT * FROM @Employee
INTERSECT
SELECT * FROM @Employee2
)
ORDER BY EmpId
/*
Emp151 Suresh 3
Emp184 John 2
Emp202 Ravi 2
Emp234 Karim 4
*/
--應用--
--DECLARE @Table,宣告一個變數資料表
DECLARE @Employee TABLE
( EmpId Varchar(10),
EmpName Varchar(25),
EmpSalary Numeric(12,0)
)
--Insert sample records,寫入幾筆樣本資料
INSERT INTO @Employee VALUES( 'Emp198', 'Shekar', 1)
INSERT INTO @Employee VALUES( 'Emp184', 'John', 1)
INSERT INTO @Employee VALUES( 'Emp151', 'Suresh', 1)
INSERT INTO @Employee VALUES( 'Emp151', 'Suresh', 2)
INSERT INTO @Employee VALUES( 'Emp198', 'Shekar', 2)
INSERT INTO @Employee VALUES( 'Emp151', 'Suresh', 3)
INSERT INTO @Employee VALUES( 'Emp151', 'Suresh', 4)
--EXCEPT加入條件式(找出EmpSalary <= 4,但是排除1 跟2 的差集資料)
SELECT * FROM @Employee
WHERE EmpSalary <= 4
EXCEPT
SELECT * FROM @Employee
WHERE EmpSalary IN (1,2)
--結果
/*
Emp151 Suresh 3
Emp151 Suresh 4
*/
--(找出EmpSalary <= 4,但是屬於2 跟3 的交集資料)
SELECT * FROM @Employee
WHERE EmpSalary <= 4
INTERSECT
SELECT * FROM @Employee
WHERE EmpSalary IN (2,3)
/*
Emp151 Suresh 2
Emp151 Suresh 3
Emp198 Shekar 2
*/
水滴可成涓流,涓流可成湖泊大海。
汲取累積知識,將知識堆積成常識;將常識探究成學識;將學識簡化為知識;授人自省。