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 - 2024. All rights reserved.