Pivot 语句随机生成 NULL 值列 (Oracle 12c)

问题描述 投票:0回答:1

我有一个使用 CTE 进行旋转的查询。我在没有旋转的情况下运行查询,结果始终相同。

但是,当我将这些数据从行转换为列(最多大约 15 列)时,我不断得到不一致的结果。透视列数据(最后一列除外)显示为 NULL。在 SQL Developer 中多次重新运行相同的查询有时会产生正确的查询,可能是 1/10 次。我什至尝试删除语句末尾的 ORDER BY 子句,得到相同的结果

这是一个非常奇怪的错误,甚至无法可靠地重现它以进行故障排除。任何人都知道为什么会发生这种情况以及如何解决它?

需要记住的一些要点:

  • 数据库中的所有索引都是最近重建的。
  • 查询未以并行方式运行
  • 运行 PIVOT 查询时数据源上没有发生 DML

下面是我运行的查询示例:

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 ;
sql oracle oracle12c
1个回答
0
投票

在我尝试为你们创建一个可重现的示例时(它非常复杂,并且希望避免泄露任何系统信息),我继续在

PIVOT
之前重写了 CTE 查询。

无需重大重写,查询逻辑是相同的。请记住,原始查询的 CTE 部分 100% 都会返回正确的结果。这些更改消除了

UNION
操作,并使用显式
JOIN
语法重写 CTE 查询。

完成此操作后,我确认在

PIVOT
之前两个 CTE 返回的结果是相同的!作为额外的好处,执行计划现在需要 10 个步骤,而不是之前的 16 个步骤。

看来修改CTE查询使Oracle在

PIVOTING
之后返回的结果更加一致,到目前为止我还没有遇到我所面临的问题。
PIVOT
现在返回预期结果

再次不确定是什么导致 Oracle 在重写后返回正确的结果,而没有任何随机

NULL
值列。我猜这可能是 Oracle 12c 中的一个错误,CTE 查询重写(以及随后生成的不同执行计划)只是让它返回正确的结果。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.