web-dev-qa-db-ja.com

定義された値のリストをCTEに組み込む

ハードコードされた値のリストのCTEを作成する方法はありますか?たとえば、既知のIDのリスト(つまり、101、102、105、200 ...)がありますが、IDと呼ばれる1つの列を持つCTEを作成するにはどうすればよいですか?ただし、すべてのID値はクエリにハードコードされていますか?ところで、私はOracleでこのクエリを実行する必要があります。ありがとう!

13
mickey_tx

あなたは次のようなことをすることができます

WITH cte AS (
  SELECT 101 id FROM dual UNION ALL
  SELECT 102 FROM dual UNION ALL
  SELECT 105 FROM dual UNION ALL
  SELECT 200 FROM dual UNION ALL
  ...
)

ただし、実際に達成しようとしていることによっては、コレクションを宣言して使用することもできます(コンマ区切りの文字列を解析する関数の有無にかかわらず)

CREATE TYPE num_tbl
    AS TABLE OF NUMBER;

WITH cte AS (
  SELECT column_value
    FROM TABLE( num_tbl( 101, 102, 105, 200 ))
)
15
Justin Cave

編集:以前にアドバイスされたソリューションはMSSQLでのみ機能します。したがって、私はOracleソリューションを追加しています。私は以下の元の答えを保持しています。

もう1つの解決策を考えました(Justin Caveによって提供されたものはまだ少し良いようですが)-一時テーブルを使用します。

これがどのように見えるかです

CREATE GLOBAL TEMPORARY TABLE temp_ids
   (id INT)
   ON COMMIT PRESERVE ROWS;

INSERT INTO ids (id) VALUES (101);
INSERT INTO ids (id) VALUES (102);
INSERT INTO ids (id) VALUES (103);

これは、Oracleデータベースの有効なソリューションである必要があります。

以下の元の回答


私は同様の問題に遭遇しました、そしてここに私の解決策があります(これはコメントで述べられているようにOracle DBでは機能しませんが、MSSQLだけです)

WITH cte AS (
    SELECT * FROM (
        VALUES
            (1, 2, 3, ...),
            (2, 3, 4, ...)
        ) AS a (col1, col2, col3, ...)
    )
INSERT INTO ...

お役に立てれば :)

13
Zax