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;
同時也有10000部Youtube影片,追蹤數超過2,910的網紅コバにゃんチャンネル,也在其Youtube影片中提到,...
「sql from兩個table」的推薦目錄:
- 關於sql from兩個table 在 91 敏捷開發之路 Facebook 的精選貼文
- 關於sql from兩個table 在 コバにゃんチャンネル Youtube 的最佳貼文
- 關於sql from兩個table 在 大象中醫 Youtube 的最佳貼文
- 關於sql from兩個table 在 大象中醫 Youtube 的最佳貼文
- 關於sql from兩個table 在 Re: [SQL ] 同時修改多筆資料讓兩個資料表的欄位值… 的評價
- 關於sql from兩個table 在 【SQL】 Access SQL JOIN 多表連接查詢–等連接、外連接 ... 的評價
- 關於sql from兩個table 在 [SQL] 為什麼要多一張表處理多對多關係?把數值都逗號分隔存 ... 的評價
- 關於sql from兩個table 在 SQL 查詢語法筆記· Issue #10 · nicehorse06/blog - GitHub 的評價
sql from兩個table 在 コバにゃんチャンネル Youtube 的最佳貼文
sql from兩個table 在 大象中醫 Youtube 的最佳貼文
sql from兩個table 在 大象中醫 Youtube 的最佳貼文
sql from兩個table 在 【SQL】 Access SQL JOIN 多表連接查詢–等連接、外連接 ... 的推薦與評價
... 式數據庫/ 關聯式資料庫的必知要點! 否則算不上學懂 SQL 指令!了解多個表格同時查詢以及不同表格之間的關係JOIN Table : INNER JOIN 等連接, OU... ... <看更多>
sql from兩個table 在 [SQL] 為什麼要多一張表處理多對多關係?把數值都逗號分隔存 ... 的推薦與評價
如果直接把資料想辦法塞在一個欄位裡,比方說在table users 上新增 ... 的確是如此,這個時候必須要跑兩個query,一個把舊資料撈出來,下一個把你把 5 ... ... <看更多>
sql from兩個table 在 Re: [SQL ] 同時修改多筆資料讓兩個資料表的欄位值… 的推薦與評價
不好意思,因為手邊沒有Mysql可以試
我用ms sql以及teradata測試的sql語法如下,給你參考
MS SQL:
UPDATE farm_tb1
SET username = a.man_name
FROM
(SELECT uid,username
FROM user_tb1) A
WHERE farm_tb1.uid = a.uid
Teradata:
UPDATE farm_tb1
FROM
(SELECT uid,username
FROM user_tb1) A
SET username = a.man_name
WHERE farm_tb1.uid = a.uid
不過照您所說的farm_tb1有些uid無法對應到user_tb1
對應不到的資料,就不會被update到囉
希望對您有幫助
※ 引述《knives ()》之銘言:
: 我的DBMS是Mysql
: 我現在有兩個table,一個叫user_tbl,一個叫 farm_tbl
: 這兩個資料表都有兩個相同的欄位,uid、username
: 有沒有辦法只下一段sql語法,就可以讓farm_tbl的 username 修改成user_tbl 的username
: 在兩邊uid都相同的情形(farm_tbl可能會沒有有uid無法對應到user_tbl 的uid)
: 謝謝回答
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.231.145.236
... <看更多>