【问题标题】:Oracle Pivot and Pivot XML - ORA-00918: column ambiguously definedOracle Pivot 和 Pivot XML - ORA-00918:列定义不明确
【发布时间】: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 语句并且它有效。以下是答案,可能有人对此有所帮助

标签: sql oracle pivot


【解决方案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;
/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    相关资源
    最近更新 更多