iT邦幫忙

0

MS SQL 2000程序需求:找出不在table中的資料

例: 有個table名為: letter,其中有個欄位: f1,內容為: a,b,c...w, 共有23筆,
我想知道'a','b','x','y' 這4筆資料,有哪些不在letter裡面 → 答案應為:'x','y'
顯然下面指令是錯的!
select * from letter where ('a','b','x','y') not in f1
請問我要怎下指令?
謝謝!

2 個回答

2
obiwanking
iT邦新手 3 級 ‧ 2012-06-25 13:34:37
最佳解答

因為你的例子是要過濾手上的資料(a,b,x,y)與目前資料表f1的比對
我用下列語法簡單表示概念

如果實務上是有大筆資料要比對, 我會先匯入一個暫存table再處理.

<pre class="c" name="code">
select a.C1
from
(
	select [C1]='a'
	union
	select 'b'
	union
	select 'x'
	union
	select 'y'
) a
where a.C1 not in (select f1 from letter)
symis iT邦新手 3 級 ‧ 2012-06-25 15:18:27 檢舉

您的方法可行,謝謝!
但另一法為:
select t.f1
from (
select 'a' as f1
union all
select 'b'
union all
select 'x'
union all
select 'y'
) t
left join letter t2
on t.f1 = t2.f1
where t2.f1 is null
(大筆資料時)不知何種較快?

建議不要用union all
因為如果有2個 'a', union all 會有2筆'a'

你的例子, 主要目的應該是找出不在 letter的資料. 直接用union 會有distinct的效果.

我之前的經驗, 用join的方法比較快.

實際上, 還是用query analyzer分析後再決定比較保險.

2
ted99tw
iT邦高手 1 級 ‧ 2012-06-22 10:56:31

symis提到:
select * from letter where ('a','b','x','y') not in f1

試試:
SELECT * FROM letter WHERE ('a' NOT IN f1) OR ('b' NOT IN f1) OR ('x' NOT IN f1) OR ('x' NOT IN f1)

symis iT邦新手 3 級 ‧ 2012-06-25 10:40:47 檢舉

我把題目簡化如下:
create table letter
(
f1 varchar(10)
)
insert into letter
values('a')
insert into letter
values('b')
insert into letter
values ('c')
insert into letter
values ('d')

run:
select * from letter
OK, 有4筆
但run您的式子卻出現:
伺服器: 訊息 170,層級 15,狀態 1,行 1
Line 1: Incorrect syntax near 'f1'.
... why?

我要發表回答

立即登入回答