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 11g 中使用 group by 和 pivot