4

我有这个查询:

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。如何更改此查询,以使结果包含所有不是 (44,9,42,15,23,73,45,33,69,63,7,49,96,81,28,57,98 的 Group_Id 数字,74,92,38)?

4

2 回答 2

9

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

所以你可以说:

Where
Ps.Group_Id NOT IN (44,9 ...)
于 2012-09-09T19:30:01.103 回答
5

正如彼得所写,使用“NOT IN”是真正的答案。
问题是为什么你使用这个列表作为一个列表......
我认为这个列表有一些意义,并且你可能有几个像这样的列表将一些组“分组”在一起。
如果是这种情况,您可能希望拥有另一个包含这些组的表,并在这个新表之间进行连接Ps.Group_Id......


编辑:
另一方面,如果您有索引 onp.Init_Dtime或 on P.Create_DtimeOracle 不能使用这些索引,因为您在函数中使用这些列。
您可能需要考虑如何在没有函数的情况下工作(您可以再添加 2 个列来保存这些列的截断值,也将它们编入索引并在查询中使用它们)


Edit2:
如果您想用表格中的信息快速而肮脏地替换列表,请记住您可以在零件select内部使用not in
如果你有t1colGroup_Id和 col的表Valid_Groups,你可以这样做:

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

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

于 2012-09-09T19:44:51.680 回答