2012-09-09 30 views
4

我有這個疑問:「IN」函數有沒有相反的地方?

Select 
Sysdate,Sum(Count(P.Init_Dtime)) 
From Player p,player_source ps 
Where 
Ps.Group_Id In (44,9,42,15,23,73,45,33,69,63,7,49,96,81,28,57,98,74,92,38) 
And P.Player_Id=Ps.Player_Id 
and 
Trunc(p.Init_Dtime) > Trunc(Sysdate) - 7 
And 
Trunc(P.Create_Dtime) >= To_Date('2012-mar-01','yyyy-mon-dd') 
And Trunc(P.Create_Dtime) < To_Date('2015-sep-9','yyyy-mon-dd') 
Group By Trunc(P.Init_Dtime) 
Order By Trunc(P.Init_Dtime) Asc 

我現在用的是「IN」功能,只包括擁有一定的數量Group_IDs。 Group_ID列的值可以是1-100。如何更改此查詢,以便結果包含所有Group_Id數字(44,9,42,15,23,73,45,33,69,63,7,49,96,81,28,57,98) ,74,92,38)?

+1

僅供參考 - 'IN'是一個運營商,而不是一個函數 –

回答

5

彼得寫道,使用「NOT IN」是真正的答案。
問題是爲什麼你使用這個列表作爲列表 ...
我認爲這個列表有一些意義,並且你可能有少數像這樣的列表將一些組「分組」在一起。
如果是這樣的話,你可能希望有另一個表與這些團體和做加入Ps.Group_Id和這個新表之間 ...


編輯:
在另一方面,如果您有p.Init_DtimeP.Create_Dtime,上的索引,Oracle不能使用這些索引,因爲您正在函數中使用這些列。
你可能要考慮如何在不函數工作(你可以加2分,將持有的截斷值的列多列索引他們以及和使用它們的查詢)


EDIT2:
如果你想快速和骯髒替換爲從表中信息的列表,只需記住,你可以使用selectnot in部分內。
如果你有表t1與山口Group_Id和col Valid_Groups,你可以這樣做:

... Where 
    Ps.Group_Id In (Select Group_Id from T1 where Valid_Groups = 'true') And ... 

同去 「」 ......

+0

這可能是一個動態sql的例子,他查詢的列表可能是以某種方式處理過的組id。 –

+0

@PeterDavidsen,多於同意......只是想確保他可以看到其他選項,以防它不是來自其他處理的動態數據:)(我假設基於問題的新手級別的知識) – Izack

+0

準確地說,以及關於在可能有或沒有索引的函數中使用列的好處。 –

8

您可以使用NOT否定表達式。

所以,你可以說:

Where 
Ps.Group_Id NOT IN (44,9 ...) 
相關問題