EXCEPT INTERSECT

SQL指令_EXCEPT 和 INTERSECT

陳淑敏 2018/12/29 15:51:48
1347

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. 參考來源

 

陳淑敏