Oracle PIVOT列空值关联其他表替换时提示列不存在问题
报错原因
- CTE语法结构错误,PIVOT行转列逻辑未纳入temp的定义范围
你当前的写法里WITH temp AS (SELECT ...)后面直接接PIVOT,等于temp的内容只有括号里的三个原始字段:Invoice_No、new_value、Column_Name,没有经过行转列处理,自然不存在D列。行转列逻辑必须写在CTE的定义括号内部,才能让temp持有A/B/C/D/E这些转列后的字段。 - JOIN关联条件存在语法错误
on temp.Invoice_No = bckup = Invoice_No是无效语法,正确的关联条件应该是temp.Invoice_No = bckup.Invoice_No
修复方案
正确的SQL写法如下:
WITH temp AS ( -- 先查原始数据,再在CTE内部完成PIVOT行转列 SELECT * FROM ( SELECT Invoice_No, new_value, Column_Name FROM table_name ) PIVOT( MAX(new_value) FOR Column_Name IN ('A' AS A, 'B' AS B, 'C' AS C, 'D' AS D, 'E' AS E) ) ) SELECT temp.Invoice_No, temp.A, temp.B, temp.C, NVL(temp.D, bckup.D) AS D, temp.E FROM temp JOIN Backup_table bckup ON temp.Invoice_No = bckup.Invoice_No
补充说明:PIVOT的IN子句里给每个值加AS 别名是为了避免部分数据库生成带单引号的列名,导致查询时需要加引号才能识别列的问题
内容的提问来源于stack exchange,提问作者ItsMeGokul
相关产品推荐
相关产品推荐

