[T-SQL] EXCEPT 和 INTERSECT 交集與差集

  • 6626
  • 0
  • SQL
  • 2016-08-03

摘要:[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
*/

 

 

 

 

水滴可成涓流,涓流可成湖泊大海。
汲取累積知識,將知識堆積成常識;將常識探究成學識;將學識簡化為知識;授人自省。