ハードコードされた値のリストのCTEを作成する方法はありますか?たとえば、既知のIDのリスト(つまり、101、102、105、200 ...)がありますが、IDと呼ばれる1つの列を持つCTEを作成するにはどうすればよいですか?ただし、すべてのID値はクエリにハードコードされていますか?ところで、私はOracleでこのクエリを実行する必要があります。ありがとう!
あなたは次のようなことをすることができます
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 ))
)
編集:以前にアドバイスされたソリューションは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 ...
お役に立てれば :)