0

次のように何かを達成したいのですが、次のクエリがあります(これと同じくらい簡単です)、

SELECT ENT_ID,TP_ID FROM TC_LOGS WHERE ENT_ID IN (1,2,3,4,5).

現在、テーブルTC_LOGSには IN 句のすべての項目が含まれていない可能性があります。TC_LOGSしたがって、テーブルには 1,2 しかないと仮定します。IN 句の項目、つまり 1,2,3,4,5 を 1,2(結果セット) と比較し、結果を FOUND - 1,2 NOT FOUND - 3,4,5 として取得したいと思います。アプリケーションコードの結果セットに XSL 変換を適用することでこれを実装しましたが、これをクエリで実現したいと思います。これは、この問題に対するより洗練されたソリューションだと思います。NVLまた、 FOUND アイテムと NOT FOUND アイテムを次のように分離するために、次のクエリを試してみました。

SELECT NVL(ENT_ID,"NOT FOUND") FROM TC_LOGS WHERE ENT_ID IN(1,2,3,4,5)

1,2,NOT FOUND,NOT FOUND,NOT FOUND という結果を期待していました

しかし、上記のクエリは結果を返しません..ここで誰かが私を正しい道に導くことができれば幸いです..どうもありがとう.

4

3 に答える 3

2

リスト内のアイテムが別のクエリから取得できる(または取得できる)と仮定すると、次のINようなことができます

WITH src AS (
  SELECT level id
    FROM dual
 CONNECT BY level <= 5)
SELECT nvl(ent_id, 'Not Found' )
  FROM src
       LEFT OUTER JOIN tc_logs ON (src.id = tc_logs.ent_id)

私の場合、srcクエリは 1 から 5 までの数字を生成するだけです。別のテーブルからそのデータを簡単にフェッチし、TABLE演算子を使用してクエリを実行するコレクションに数字をロードし、一時テーブルに数字をロードすることもできます。INリストデータの決定方法に応じて、クエリなど。

于 2012-10-09T16:29:11.717 に答える
0

テーブル(テーブル src を使用しましょう)にすべての(1,2,3,4,5)値が含まれている場合は、完全結合を使用できます。(WITH src AS ( SELECT level id FROM dual CONNECT BY level <= 5) を src テーブルとしても使用できます)

         SELECT 
           ent_id,tl.tp_id,src.tp_id 
         FROM 
           src
        FULL JOIN
          tc_logs tl
        USING (ent_id)
        ORDER BY
          ent_id

oracle full join の Web サイトはこちらです。http://psoug.org/snippet/Oracle-PL-SQL-ANSI-Joins-FULL-JOIN_738.htm

于 2012-10-09T17:08:49.530 に答える
0

IN ステートメントと一致しない場合、値 (NULLS を含む) が返されないため、NVL は機能しません。

あなたができることは次のようなものです:

SELECT NVL(ENT_ID, "NOT FOUND") 
FROM TC_LOGS
RIGHT OUTER JOIN (
   SELECT 1 AS 'TempID' UNION 
   SELECT 2 UNION 
   SELECT 3 UNION
   SELECT 4 UNION 
   SELECT 5) AS Sub ON ENT_ID = TempID

外部結合は、一致しない ENT_ID に対して NULLS を返します。私は Oracle の専門家ではないため、この構文が完全であることを保証できないことに注意してください。

于 2012-10-09T16:32:24.663 に答える