【问题标题】:Using cursor with table that has duplicate column names将游标与具有重复列名的表一起使用
【发布时间】:2018-07-19 15:08:42
【问题描述】:

假设table1 具有列abctable2 具有列bcd

连接两个表后,如何用游标遍历“连接表”并提取例如table1中b列的值。如何区分重复的列名?

我发现的一种方法是为列指定别名,但这意味着我必须手动键入 select * 语句的所有其他列,即使只有一列会重复。

有没有类似的东西

for c in (select * from table1 join table2 on (...)) loop
     dbms_output.put_line(c.table1.b);
     dbms_output.put_line(c.table2.b);
end loop;

?

谢谢。

【问题讨论】:

  • 你为什么还要使用游标,而你可以解决它而不是集合基础解决方案?

标签: sql oracle plsql cursor


【解决方案1】:

您不必手动键入所有列。只需使用 describe table1table2 并通过在末尾添加逗号和表格的通用后缀来复制粘贴列名。您可以使用任何编辑器,如 notepad++ 或 editplus 来处理这些事情。它并不像看起来那么费力。

另一种方法是使用来自USER_TAB_COLUMNScolumn_names 构造连接查询。然后,您可以使用它在您的程序中动态打开CURSOR

WITH tab1 AS
(
         SELECT   listagg('t1.' ||column_name
                           ||' as '
                           ||column_name
                           ||'_t1' ,',') WITHIN GROUP ( ORDER BY ROWNUM )  
                           col_names FROM USER_TAB_COLUMNS WHERE TABLE_NAME IN ('TABLE1') ), 


            tab2 AS ( SELECT LISTAGG('t2.'||column_name||' AS '||column_name||'_t2',',') 
                                 within GROUP ( ORDER BY ROWNUM ) col_names
         FROM     user_tab_columns
         WHERE    table_name IN ('TABLE2') )
SELECT     'SELECT  '
                      || a.col_names
                      || nvl2(a.col_names, nvl2(b.col_names,',',NULL),NULL)
                      || b.col_names||' FROM TABLE1 t1 JOIN TABLE2 t2 ON t1.id = t2.id'
FROM       tab1 a
cross join tab2 b; 

【讨论】:

    猜你喜欢
    • 2016-07-30
    • 1970-01-01
    • 2014-12-30
    • 2012-04-22
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    相关资源
    最近更新 更多