EXCEPT
INTERSECT
SQL指令_EXCEPT 和 INTERSECT
2018/12/29 15:51:48
1
4079
SQL指令_EXCEPT 和 INTERSECT
簡介 |
介紹如何在資料庫中操作兩張資料表時,需要撈取哪些資料是重覆或哪些資料某張表有的需求。 |
作者 |
陳淑敏 |
1. 前言
當有需要比對兩張資料表,撈取重覆的資料或是撈取其中一個表才有的資料,
以往都會用Inner 或是 Left Join 實現,不過SQL也有兩個指令EXCEPT和 INTERSECT可使用 。
此運算式適用於SQL Server 2008以上版本。
2. 開始前準備
實作此運算式是建立於以下版本的環境: SQL Server 2017
3. 指令敘述說明
•EXCEPT:會從左側查詢中傳回在右側查詢中找不到的任何個別值
•INTERSECT:會傳回 INTERSECT 運算元左右兩側查詢都傳回的任何個別值
4. 使用規則
使用上述的兩個查詢,其結果集的基本組合規則如下:
•在所有查詢中,資料行的數目和順序都必須相同。
•資料類型必須相容。
5. 實作演練
先建立資料表[Area],執行以下語法即可:
USE [Test]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Area](
[REG_UNIT] [smallint] NULL,
[REG_UNIT_NAME] [varchar](20) NULL,
[AREA_CODE] [smallint] NULL,
[AREA_NAME] [varchar](20) NULL
) ON [PRIMARY]
GO
INSERT [dbo].[Area] ([REG_UNIT], [REG_UNIT_NAME], [AREA_CODE], [AREA_NAME]) VALUES (55, '昕力保險', 10, '南京處')
INSERT [dbo].[Area] ([REG_UNIT], [REG_UNIT_NAME], [AREA_CODE], [AREA_NAME]) VALUES (55, '昕力保險', 10, '南京處')
INSERT [dbo].[Area] ([REG_UNIT], [REG_UNIT_NAME], [AREA_CODE], [AREA_NAME]) VALUES (55, '昕力保險', 10, '南京處')
INSERT [dbo].[Area] ([REG_UNIT], [REG_UNIT_NAME], [AREA_CODE], [AREA_NAME]) VALUES (55, '昕力保險', 10, '南京處')
INSERT [dbo].[Area] ([REG_UNIT], [REG_UNIT_NAME], [AREA_CODE], [AREA_NAME]) VALUES (55, '昕力保險', 10, '南京處')
INSERT [dbo].[Area] ([REG_UNIT], [REG_UNIT_NAME], [AREA_CODE], [AREA_NAME]) VALUES (55, '昕力保險', 10, '南京處')
INSERT [dbo].[Area] ([REG_UNIT], [REG_UNIT_NAME], [AREA_CODE], [AREA_NAME]) VALUES (55, '昕力保險', 10, '南京處')
INSERT [dbo].[Area] ([REG_UNIT], [REG_UNIT_NAME], [AREA_CODE], [AREA_NAME]) VALUES (55, '昕力保險', 10, '南京處')
INSERT [dbo].[Area] ([REG_UNIT], [REG_UNIT_NAME], [AREA_CODE], [AREA_NAME]) VALUES (55, '昕力保險', 10, '南京處')
INSERT [dbo].[Area] ([REG_UNIT], [REG_UNIT_NAME], [AREA_CODE], [AREA_NAME]) VALUES (55, '昕力保險', 10, '南京處')
INSERT [dbo].[Area] ([REG_UNIT], [REG_UNIT_NAME], [AREA_CODE], [AREA_NAME]) VALUES (55, '昕力保險', 20, '新竹處')
INSERT [dbo].[Area] ([REG_UNIT], [REG_UNIT_NAME], [AREA_CODE], [AREA_NAME]) VALUES (55, '昕力保險', 20, '新竹處')
INSERT [dbo].[Area] ([REG_UNIT], [REG_UNIT_NAME], [AREA_CODE], [AREA_NAME]) VALUES (55, '昕力保險', 20, '新竹處')
INSERT [dbo].[Area] ([REG_UNIT], [REG_UNIT_NAME], [AREA_CODE], [AREA_NAME]) VALUES (55, '昕力保險', 20, '新竹處')
INSERT [dbo].[Area] ([REG_UNIT], [REG_UNIT_NAME], [AREA_CODE], [AREA_NAME]) VALUES (55, '昕力保險', 20, '新竹處')
INSERT [dbo].[Area] ([REG_UNIT], [REG_UNIT_NAME], [AREA_CODE], [AREA_NAME]) VALUES (55, '昕力保險', 30, '一心處')
INSERT [dbo].[Area] ([REG_UNIT], [REG_UNIT_NAME], [AREA_CODE], [AREA_NAME]) VALUES (55, '昕力保險', 30, '一心處')
INSERT [dbo].[Area] ([REG_UNIT], [REG_UNIT_NAME], [AREA_CODE], [AREA_NAME]) VALUES (55, '昕力保險', 30, '一心處')
INSERT [dbo].[Area] ([REG_UNIT], [REG_UNIT_NAME], [AREA_CODE], [AREA_NAME]) VALUES (55, '昕力保險', 30, '一心處')
INSERT [dbo].[Area] ([REG_UNIT], [REG_UNIT_NAME], [AREA_CODE], [AREA_NAME]) VALUES (55, '昕力保險', 30, '一心處')
INSERT [dbo].[Area] ([REG_UNIT], [REG_UNIT_NAME], [AREA_CODE], [AREA_NAME]) VALUES (55, '昕力保險', 30, '一心處')
撈取已建立完成的資料表[Area]。
SELECT * FROM [dbo].[Area]
以下就以Area資料表執行此兩種指令的結果:
•使用EXCEPT指令,撈取Area資料中不等於AREA_CODE=20的其他的資料:
select * from Area
EXCEPT
select * from Area
where AREA_CODE = '20'
•使用INTERSECT指令,撈取Area資料中包含AREA_NAME=新竹處的資料:
select * from Area
INTERSECT
select * from Area
where AREA_NAME = '新竹處'
6. 參考來源
-
https://blog.xuite.net/f8789/DCLoveEP/26221779-SQL+-+%E5%AF%A6%E4%BD%9C+EXCEPT+%E5%92%8C+INTERSECT