有没有办法为硬编码值列表构建CTE?例如,我有一个已知ID列表(即101,102,105,200 ...),我如何能够创建一个名为ID的列的CTE,但所有ID值在查询中都是硬编码的?顺便说一句,我需要在Oracle中运行此查询。谢谢!
答案 0 :(得分: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
...
)
根据您真正想要完成的任务,您可能需要声明一个集合并使用它(使用或不使用解析逗号分隔字符串的函数)
CREATE TYPE num_tbl
AS TABLE OF NUMBER;
WITH cte AS (
SELECT column_value
FROM TABLE( num_tbl( 101, 102, 105, 200 ))
)
答案 1 :(得分:10)
我想到了另一个解决方案(尽管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 ...
希望这会有所帮助:)