oracle选择查询,动态构建列

时间:2016-05-27 13:40:34

标签: sql oracle

我通过以下查询返回主键:

SELECT b.column_name
FROM all_constraints a, all_cons_columns b
WHERE a.constraint_name = b.constraint_name
AND a.table_name = 'tableX';
AND a.constraint_type = 'P'

...并且查询返回3行,例如
一个

C

现在我想创建一个嵌套在上面查询中的查询,以创建另一个查询,如:

SELECT A, B, C 
FROM tableY

所以A,B,C部分需要被查询替换。有任何想法吗? 我正在使用Oracle 11G。

1 个答案:

答案 0 :(得分:1)

正如Ed和Mat建议的那样,这几乎肯定是通过EXECUTE IMMEDIATE或一些输出查询的PL / SQL块来完成的。

对于必须在单个SQL语句中执行此操作的极少数情况,请尝试我的开源项目Method4。它允许您运行查询生成的查询。它比一般的SQL语句更强大,但更混乱,更慢,更虚伪。

--Sample schema:
drop table tablex;
create table tableX(A number, B number, C number, D varchar2(10),
    constraint tableX_pk primary key (A,B,C));
insert into tableX values (1,2,3,'4');

--Query the primary key columns of a table.
select * from table(method4.dynamic_query(
    q'[
        --Query that returns a query.
        SELECT
            'select '||listagg(b.column_name,',') within group (order by column_name)||
            ' from '||a.table_name v_sql
        FROM all_constraints a, all_cons_columns b
        WHERE a.constraint_name = b.constraint_name
            AND a.table_name = 'TABLEX'
            AND a.constraint_type = 'P'
        GROUP BY a.table_name
    ]'
));

--Results:
A   B   C
-   -   -
1   2   3