20

テーブルを作成してデータを挿入せずに、SQLで使用する一時的な結果セットを作成するにはどうすればよいですか?

例:たとえば、10個のコードのリストがあります。これをクエリに入れてから、データベースにクエリを実行して、この一時リストのどのコードがテーブルに存在しないかを確認します。

それがすでにテーブルにある場合、私は次のようなことをすることができます:

SELECT
  ITEM_CODE
FROM
  TEMP_ITEMS
MINUS
SELECT
   ITEM_CODE
FROM
   M_ITEMS

PL / SQLを使用せずに、純粋なSQLを使用してクエリを実行する前に一時的な行セットを作成する方法はありますか?次のような回答はしないでください。

SELECT 1 FROM DUAL
UNION ALL
SELECT 2 FROM DUAL

私は、INステートメントでコードを提供できるものを考えています。それは、後のクエリで使用するためにそれを行に変換します。

編集:誰もがここで私の目的を知っているので、基本的に私は時々、リスト内のどれが私たちのシステムで設定されていないかを見つけるために必要な製品コードのリストを取得します。これをSQLステートメントにスローして、(データなどをインポートするのではなく)システムにないものを確認できるようにするための簡単な方法が必要です。私は通常、これらをExcelに入れてから、次のような式を実行します。

="'"&A1&"',"

カンマ区切りのリストを作成できるようにします。

4

5 に答える 5

33

Oracle 11gを使用している場合、これを行うことができます

with t as 
(
 select (column_value).getnumberval() Codes from xmltable('1,2,3,4,5')
)
SELECT * FROM t
WHERE NOT EXISTS (SELECT 1 FROM M_ITEMS M WHERE codes = M.ITEM_CODE);

また

with t as 
(
 select (column_value).getstringval() Codes from xmltable('"A","B","C"')
)
SELECT * FROM t
WHERE NOT EXISTS (SELECT 1 FROM M_ITEMS M WHERE codes = M.ITEM_CODE);
于 2012-08-29T01:58:15.880 に答える
4

私は一緒に行きます:

with t as (
    select 1 as val from dual union all
    select 2 as val from dual
)
select . . .

次に、後続のクエリブロックで、「t」またはそれを呼び出すものを使用します。

selectメソッドを使用することに異論があるのか​​わかりません。。。必要な値をExcelの列にポップし、数式をコピーして各値のコードを生成するだけです。次に、結果をクエリインターフェイスに貼り付けます。

一時テーブルを使用する場合は、values句を使用できます。または、IN機能のみが必要な場合は、文字列関数を使用できます。値をコンマ区切りのリストに入れて、特定の値と一致するかどうかを確認します。

where ','||<list>||',' like '%,'||col||',%'
于 2012-08-29T01:48:38.603 に答える
3

私が傾倒する2つのアプローチがあります。

1. グローバル一時テーブル

テーブルを作成したくないと言っていますが、それはテーブルを作成したくない理由によって異なります。グローバル一時テーブルを作成することを選択した場合、行はそれらを挿入したセッションにのみ表示されるため、プライベートなメモリ内テーブルを持つようなものですが、実際のテーブルのすべての利点を提供します-つまり、クエリと結合が可能です.それに。

2.パイプライン関数

TABLE()演算子を使用してクエリできる形式で結果を返す関数を作成できます。詳細はこちら: http://www.oracle-base.com/articles/misc/pipelined-table-functions.php

于 2012-08-29T01:59:23.683 に答える
2

それは少しばかげているようです。ただし、10g 以降を使用している場合は、正規表現を使用して文字列を個別の行に解析できます。例えば

SQL> ed
Wrote file afiedt.buf

  1   SELECT REGEXP_SUBSTR('a,b,c,def,g', '[^ |,]+', 1, LEVEL) parsed_str
  2     FROM dual
  3* CONNECT BY LEVEL <= REGEXP_COUNT('a,b,c,def,g', '[^ |,]+')
SQL> /

PARSED_STR
--------------------------------------------
a
b
c
def
g

個人的には、コレクションを生成するパイプライン化されたテーブル関数または PL/SQL ブロックの方が理解しやすいと思いますが、SQL で行う必要がある場合は可能です。

あなたの編集に基づいて、すでにある種のファイルにある製品コードのリストを取得している場合は、外部テーブルを使用してファイルをテーブルとして公開するか、SQL*Loader を使用してロードする方が理にかなっているようです。クエリ可能なテーブル (一時的または永続的) にデータを格納します。これらのオプションのいずれかを除いて、最初に Excel でリストを操作したい場合は、Excel でINリストを生成し、それをコピーしてクエリに貼り付ける方が理にかなっています。Excel でコンマ区切りのコードのリストを生成して、そのリストを SQL の構成要素に解析するだけでは、手順が多すぎるように思えます。

于 2012-08-29T02:23:39.083 に答える