NOT IN/NOT EXISTS/EXCEPT 使用注意事項
#SQL
【SQL Tips】之【 NULL處理技巧,使用NOT IN /NOT EXISTS/EXCEPT】
許多時候,兩個資料表要找出差異值的時候,許多人第一直覺就是使用【NOT IN】,當然大部分時候都不會有狀況,但是碰到NOT IN的子查詢資料值,如果有NULL,就全盤皆輸,意思就是找不出任何差異。這樣在小量資料可以藉由眼力觀察的狀況下,還可以找出這樣寫法NOT IN的危險地方,但是碰到背景程式,或是資料量多的時候,幾乎無法觀察到這樣危險。所以,告訴自己不要再用【NOT IN】去找出兩邊資料差異。
反倒是要使用【NOT EXISTS】寫法,雖然是複雜一點,但是跨越SQL Server與Oracle兩種資料庫,都是可以正常找出兩邊資料差異值,不擔心NOT EXISTS的基礎資料表有NULL值狀況。另外值得一提就是,需多人會直接使用SQL Server的【EXCEPT】與Oracle的【MINUS】方式,要留意再留意,這樣的方式雖然可以找出差異值,但是針對回傳值,會自動進行重複資料列移除。
【SQL Server Code】
if object_id('x') is not null
drop table x
go
--建立比對基礎資料
create table x(a int)
go
insert into x values(1)
insert into x values(1) --注意重複
insert into x values(NULL) --注意NULL
go
if object_id('y') is not null
drop table y
go
--建立簡單比對來源資料
create table y(b int not null)
go
insert into y values(1)
insert into y values(1)
insert into y values(2)
insert into y values(2)
insert into y values(2) --注意三個2
go
--三種找出y資料表中(1,1,2,2,2) 然後不存在於 x資料表中的(1,1,null)
--【預期要回傳三個2】
--第一種 使用NOT IN 注意(子查詢有NULL值)
--無法處理對比資料表有NULL狀況
SELECT b
FROM y
WHERE b NOT IN(SELECT a from x)
GO
--第二種 使用NOT EXISTS 注意(SELECT 需要 JOIN)
--忠實回傳三個2
SELECT b
FROM y
WHERE NOT EXISTS (SELECT * FROM x WHERE x.a = y.b)
GO
--第三種 使用EXCEPT (僅回傳一個2)
SELECT b FROM y
EXCEPT
SELECT a FROM x
GO
【Oracle Code】
drop table x purge;
--建立比對基礎資料
create table x(a int);
insert into x values(1);
insert into x values(1); --注意重複
insert into x values(NULL); --注意NULL
drop table y purge;
--建立簡單比對來源資料
create table y(b int not null);
insert into y values(1);
insert into y values(1);
insert into y values(2);
insert into y values(2);
insert into y values(2); --注意三個2
--三種找出y資料表中(1,1,2,2,2) 然後不存在於 x資料表中的(1,1,null)
--第一種 使用NOT IN 注意(子查詢有NULL值)
--無法處理對比資料表有NULL狀況
SELECT b
FROM y
WHERE b NOT IN(SELECT a from x);
--第二種 使用NOT EXISTS 注意(SELECT 需要 JOIN)
--忠實回傳三個2
SELECT b
FROM y
WHERE NOT EXISTS (SELECT * FROM x WHERE x.a = y.b);
--第三種 使用EXCEPT (僅回傳一個2)
SELECT b FROM y
MINUS
SELECT a FROM x;
oracle sql查詢 在 軟體開發學習資訊分享 Facebook 八卦
課程名稱:SQL和資料庫設計A-Z™:學習 MS SQL Server + PostgreSQL https://goo.gl/sXGJR2
你是否對資料科學或是資料分析有興趣?
在這種情況下,你將不得不在工作中遇到資料庫。
但是如何與資料庫進行互動?
答案很簡單:SQL
SQL代表結構化查詢語言,這是用於組織資料庫,輸入資料並根據請求提取資料的主要工具之一。
在本課程中,你將學習如何在名為 PostgreSQL 受歡迎的 SQL 變種資料庫中創建查詢。
即使在您的工作場所,你正在使用不同的變種(例如Oracle,SQL Server或MySQL),你將發現在本課程中學習的技能很容易轉移。
>課程有英文字幕,詳細介紹請參考 https://goo.gl/sXGJR2
>觀看更多線上課程介紹影片可參考 https://goo.gl/AXvm2Z
oracle sql查詢 在 軟體開發學習資訊分享 Facebook 八卦
學習如何快速有效地使用SQL!你將學習如何使用需求最高的技能之一 – PostgreSQL,將複雜查詢讀寫到資料庫。這些技能也適用於任何其他主要的SQL資料庫,如MySQL、Microsoft SQL Server 、Amazon Redshift、Oracle等等。🔥報名參加課程 https://bit.ly/35ClGda
oracle sql查詢 在 查詢Oracle正在執行和執行過的SQL語句 - 隨意窩 的相關結果
正在執行的 select a.username, a.sid,b.SQL_TEXT, b.SQL_FULLTEXT from v$session a, v$sqlarea b where a.sql_address = b.address. ---執行過的 select b. ... <看更多>
oracle sql查詢 在 [SQL] MSSQL,Oracle如何找出所有資料表(Table)?所有欄位? 的相關結果
Oracle --登入的帳號在目前資料庫中可以存取的DBA的資料表SELECT * FROM DBA_TABLES --登入的帳號在目前資料庫中可以存取的所有的資料表SELECT * FROM ... ... <看更多>
oracle sql查詢 在 建立SQL 查詢 的相關結果
建立SQL 查詢 · 按一下資料整合首頁上的動作,然後按一下查詢。 · 按一下查詢畫面上的新增 ( 顯示「新增」圖示的影像。 ) · 在建立查詢畫面的查詢名稱中,指定SQL 查詢的名稱。 ... <看更多>