sql - "IN"函数有反面吗?

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

最佳答案

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

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

编辑2:
如果您想用表中的信息快速而肮脏地替换列表,请记住您可以在 select 部分中使用 not in
如果您有带有 col t1 和 col Group_Id 的表 Valid_Groups ,您可以执行以下操作:

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

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

关于sql - "IN"函数有反面吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12342231/

相关文章:

Oracle打包多个 session 的全局变量

mysql - 仅在不同组中的所有元素对的 SQL 查询

java - 如何解决最新结果的数据库排序问题

sql - 如何有效地查询具有修订值的表?

mysql - 简单但棘手的 sqlite 搜索查询

oracle - 使用 PL/SQL 增加多个时间戳值

mysql - 从 2 个没有要连接的公共(public)列的表中选择查询插入查询

sql - ALTERNATE TO SQL GROUPBY(例如避免在聚合字段上重复)

mysql - 与连接表的多对多关系

javascript - 如何避免在 postgres 数据库中插入空值