我正在尝试将几个不同宽度的SELECT联合成一个结果。在Oracle标准SQL中,但由于缺乏权限,不允许使用PL / SQL。该查询大致如下(带有注释)。
1 SELECT * FROM [FOO] WHERE ROWNUM=1
2 UNION
3 SELECT COUNT(*), {n-1 null columns} FROM [FOO]
源表[FOO]
在运行时被替换为查询,它的列数和列标签是任意的,并且事先未知,但是查询的第一行只是将它们全部捕获。
在查询的第3行中,我希望用[FOO]
表的整数行数填充第一列,然后再根据需要填充尽可能多的Null列(表宽度减去1)第1行产生的正确列数。理想情况下,结果将如下所示。
我认为这很棘手的部分是使其适用于#1行中的任意宽度或列标签。除了上面的UNION假设之外,还有其他方法吗?谢谢大家。
答案 0 :(得分:1)
从关于添加一列而不是一行的建议的评论开始:
到目前为止,我一直受阻,因为您不能将数据列与聚合函数混在一起
您可以使用分析等效项。这使用了HR示例模式的departments
表,该表具有27行,但只能替换任何表名-但是您需要保留表别名,因此可以执行t.*
:
select count(*) over (partition by null) as total_count,
t.*
from departments t;
TOTAL_COUNT DEPARTMENT_ID DEPARTMENT_NAME MANAGER_ID LOCATION_ID
----------- ------------- ------------------------------ ---------- -----------
27 10 Administration 200 1700
27 20 Marketing 201 1800
27 30 Purchasing 114 1700
...
不过,您不能仅添加rownum
检查,因为它只会计算结果集中的行:
select count(*) over (partition by null) as total_count,
t.*
from departments t
where rownum = 1;
TOTAL_COUNT DEPARTMENT_ID DEPARTMENT_NAME MANAGER_ID LOCATION_ID
----------- ------------- ------------------------------ ---------- -----------
1 10 Administration 200 1700
所以您需要使用子查询:
select *
from (
select count(*) over (partition by null) as total_count,
t.*
from departments t
)
where rownum = 1;
TOTAL_COUNT DEPARTMENT_ID DEPARTMENT_NAME MANAGER_ID LOCATION_ID
----------- ------------- ------------------------------ ---------- -----------
27 10 Administration 200 1700
当然,您通常还是会使用子查询,以便可以在选择单行之前对内部查询进行排序。