9

これが私のクエリです:

Select a.* from Table1 a, Table2 b
Where 
a.tid=b.tid and 
b.createddate=(Select max(createddate) from Table2) and
a.tid not in (Select distinct tid from Table3);

問題は、これが有効な出力を返す必要があることを知っていますが、そうではありません。a.tidの最後の行が含まれていない問題 (Table3 から個別の tid を選択)。Select distinct tid from Table3 を ('T001','T002','T003','T004') のようなハードコードされた値に置き換えると、正常に動作し、データが返されます。

どうしたの?何か不足していますか?助けてください。

4

2 に答える 2

24

これを試して:

Select a.* from Table1 a, Table2 b
Where 
a.tid=b.tid and 
b.createddate=(Select max(createddate) from Table2) and
a.tid not in (Select tid from Table3 where tid is not null);

コメントのすべての人が言及したように、table3 の tid に null 値を持つ行が少なくとも 1 つある場合、行は返されません。これは、Oracleにとってnullは「この値が何かわからない」と言っているようなものだからです。オラクルは、この「不明な」値が実際に何であるかを知らないため、検索している値が副選択に含まれていないと確信を持って言うことはできません。また、ドキュメントにはそのように機能すると書かれています: http://docs.oracle.com/cd/B28359_01/server.111/b28286/conditions013.htm

別のオプションは、クエリを次のように記述することです。

Select a.* from Table1 a, Table2 b
Where 
a.tid=b.tid and 
b.createddate=(Select max(createddate) from Table2) and
not exists (Select null from Table3 t3 where t3.tid = a.tid);

null の処理は、not exists と not in の主な違いの 1 つです。

于 2012-07-18T19:14:47.433 に答える
0

あなたのクエリは、わずかに書き直されました:

Select a.*
from Table1 a join
     Table2 b 
     on a.tid=b.tid 
where b.createddate=(Select max(createddate) from Table2) and
      a.tid not in (Select distinct tid from Table3)

これは、Table2 からの作成日が最大の tid が Table3 にあることを示しています。

これをテストするには、table2 から最大の作成日を取得します。次に、この最大値に対応する table1 のすべてのレコードを取得します。これらも表 3 にあることがわかります。

推測する必要がある場合は、全体の最大値ではなく、Table2 のテーブルごとの最大作成日が必要になる場合があります。

ところで、Oracle (および他のほとんどのデータベース) では、最後のサブクエリの個別は冗長です。この場合、データベースは重複を削除するのに十分なほどスマートでなければなりません。

于 2012-07-18T18:51:29.263 に答える