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

Peterが書いたように、「NOTIN」を使用することが本当の答えです。
問題は、なぜこのリストをリストとして使用しているのかということです...
このリストには何らかの意味があり、いくつかのグループを「グループ化」したこのようなリストはほとんどないかもしれないと思いました。
この場合、これらのグループを含む別のテーブルを作成し、この新しいテーブルとの間で結合を行うことができます...Ps.Group_Id


編集:
別の注意点として、インデックスがオンp.Init_Dtimeまたはオン にある場合、関数内でこれらの列を使用しているためP.Create_DtimeOracleはそれらのインデックスを使用できません。
関数なしで作業する方法を検討することをお勧めします(これらの列の切り捨て値を保持する2つの列を追加し、それらにもインデックスを付けて、クエリで使用できます)


Edit2:リストをテーブルの情報にすばやく汚く置き換えたい場合は、パーツ内で
使用できることを覚えておいてください。colとcolを含む テーブルがある場合は、次のことができます。selectnot in
t1Group_IdValid_Groups

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

同じことが「ではない」にも当てはまります...

于 2012-09-09T19:44:51.680 に答える