是否与“IN”功能相反?

时间:2012-09-09 19:27:52

标签: sql oracle

我有这个问题:

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_ID。 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)?

2 个答案:

答案 0 :(得分:8)

您可以使用NOT来否定表达式。

所以你可以说:

Where
Ps.Group_Id NOT IN (44,9 ...)

答案 1 :(得分:5)

正如彼得所写,使用“NOT IN”是真正的答案 问题是为什么要将此列表用作列表 ...
我认为这个列表有一些含义,你可能有很少的这样的列表将一些组“分组”在一起  如果是这种情况,您可能希望将另一个表与这些组相关联,并在Ps.Group_Id和此新表之间执行加入 ...


编辑:
另请注意,如果您在p.Init_DtimeP.Create_Dtime上有索引, Oracle无法使用这些索引,因为您在函数中使用这些列。
您可能想要考虑如何在没有函数的情况下工作(您可以添加另外两列来保存这些列的截断值,并将它们编入索引并在查询中使用它们)


EDIT2:
如果您希望使用表格中的信息快速而肮脏地替换列表,请记住您可以在 select 部分内使用 not in
如果您的表t1包含col Group_Id和col Valid_Groups,则可以执行以下操作:

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

同样适用于“不在”......