在CTE中构建已定义值的列表

mic*_*_tx 12 sql oracle common-table-expression

有没有办法为硬编码值列表构建CTE?例如,我有一个已知ID的列表(即101,102,105,200 ...),我如何能够创建一个名为ID的列的CTE,但所有ID值在查询中都是硬编码的?顺便说一句,我需要在Oracle中运行此查询.谢谢!

Jus*_*ave 14

你可以做点什么

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
  ...
)
Run Code Online (Sandbox Code Playgroud)

但是,根据您真正想要完成的任务,您可能需要声明一个集合并使用它(使用或不使用解析逗号分隔字符串的函数)

CREATE TYPE num_tbl
    AS TABLE OF NUMBER;

WITH cte AS (
  SELECT column_value
    FROM TABLE( num_tbl( 101, 102, 105, 200 ))
)
Run Code Online (Sandbox Code Playgroud)


Zax*_*Zax 11

编辑:以前建议的解决方案仅适用于MSSQL.因此,我正在添加Oracle解决方案.我保留下面的原始答案.

我想到了另一个解决方案(尽管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);
Run Code Online (Sandbox Code Playgroud)

这应该是Oracle数据库的有效解决方案.

原答案如下


我遇到过类似的问题,这是我的解决方案(这不适用于评论中提到的Oracle DB,但只有MSSQL)

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

希望这可以帮助 :)