Oracle Pivot 和 Pivot XML - ORA-00918:列定义不明确

Posted

技术标签:

【中文标题】Oracle Pivot 和 Pivot XML - ORA-00918:列定义不明确【英文标题】:Oracle Pivot and Pivot XML - ORA-00918: column ambiguously defined 【发布时间】:2020-05-29 10:22:05 【问题描述】:

我正在尝试执行枢轴操作。枢轴工作正常。如果我想动态传递查询而不是硬编码值。根据使用的 Pivot XML 中的文档,但它提供了错误。任何建议都会有所帮助,

Pivot 正常工作:

select * from
(select  column_name from cols where table_name = 'EMPLOYEES') aa
pivot
(
max(aa.column_name)
for column_name in ('EMPLOYEE_ID', 'FIRST_NAME')
);

Pivot XML 抛出错误:

select * from
(select  column_name,  table_name from cols  where table_name = 'EMPLOYEES')
pivot xml
(
max(column_name)
for column_name in (select  column_name from cols where table_name = 'EMPLOYEES')
);

ORA-00918: column ambiguously defined
00918. 00000 -  "column ambiguously defined"
*Cause:    
*Action:

尝试提供别名,但仍然没有帮助。

我们有没有其他方法可以在 IN 子句中定义子查询

【问题讨论】:

对所有列进行限定是一种很好的编程方式,至少在涉及多个表时是这样。 IE。做cols.column_name 而不仅仅是column_name 试过了,还是不行 @JimMacaulay 。 . .为此,您需要使用动态 SQL —— 即在 PL/SQL 语句中使用execute immediate @GordonLinoff,感谢您的建议,按照您的建议尝试了 PL/SQL 语句并且它有效。以下是答案,可能有人对此有所帮助 【参考方案1】:

尝试使用 PL/SQL 语句,结果符合预期。下面是PL/SQL语句,

declare 

v_Sql1 varchar(1000);
v_Sql2 varchar(1000);

begin

select  (LISTAGG(chr(39)||column_name||chr(39), ',') WITHIN GROUP (ORDER BY column_id)) into v_Sql1 from cols where table_name = 'EMPLOYEES'; 

v_Sql2:= 'select * from
(select  column_name from cols where table_name = ''EMPLOYEES'') 
pivot
(
max(column_name)
for column_name in (' || v_Sql1 || '))'; 

dbms_output.put_line(v_Sql1);
dbms_output.put_line(v_Sql2);

execute immediate v_Sql2;

end;
/

【讨论】:

以上是关于Oracle Pivot 和 Pivot XML - ORA-00918:列定义不明确的主要内容,如果未能解决你的问题,请参考以下文章

oracle pivot 和 unpivot 函数的使用

如何在 Oracle 11g 中使用 group by 和 pivot

Oracle Pivot简单用法

Oracle pivot & unpivot

PIVOT在SQL Sever里面和Oracle里面的用法区别

ORACLE 上的 PIVOT / GROUP BY 问题