我有一个使用 CTE 进行旋转的查询。我在没有旋转的情况下运行查询,结果始终相同。
但是,当我将这些数据从行转换为列(最多大约 15 列)时,我不断得到不一致的结果。透视列数据(最后一列除外)显示为 NULL。在 SQL Developer 中多次重新运行相同的查询有时会产生正确的查询,可能是 1/10 次。我什至尝试删除语句末尾的 ORDER BY 子句,得到相同的结果
这是一个非常奇怪的错误,甚至无法可靠地重现它以进行故障排除。任何人都知道为什么会发生这种情况以及如何解决它?
需要记住的一些要点:
下面是我运行的查询示例:
WITH T1 AS
(SELECT COL1,
COL2,
COL3,
COL4,
COL5
FROM SOURCE_DATA)
SELECT *
FROM
(SELECT *
FROM T1 PIVOT(MAX(COL2)
FOR (COL3) IN (1 AS "1", 2 AS "2", 3 AS "3", 4 AS "4",
5 AS "5", 6 AS "6", 7 AS "7", 9 AS "9",
12 AS "12", 16 AS "16", 17 AS "17", 19 AS "19",
21 AS "21", 22 AS "22",23 AS "23"))) ORDER BY COL1 ;
在我尝试为你们创建一个可重现的示例时(它非常复杂,并且希望避免泄露任何系统信息),我继续在
PIVOT
之前重写了 CTE 查询。
无需重大重写,查询逻辑是相同的。请记住,原始查询的 CTE 部分 100% 都会返回正确的结果。这些更改消除了
UNION
操作,并使用显式 JOIN
语法重写 CTE 查询。
完成此操作后,我确认在
PIVOT
之前两个 CTE 返回的结果是相同的!作为额外的好处,执行计划现在需要 10 个步骤,而不是之前的 16 个步骤。
看来修改CTE查询使Oracle在
PIVOTING
之后返回的结果更加一致,到目前为止我还没有遇到我所面临的问题。 PIVOT
现在返回预期结果
再次不确定是什么导致 Oracle 在重写后返回正确的结果,而没有任何随机
NULL
值列。我猜这可能是 Oracle 12c 中的一个错误,CTE 查询重写(以及随后生成的不同执行计划)只是让它返回正确的结果。