一个SELECT可以检索任意数量的列,然后合并一个单列,后跟null

时间:2018-08-31 21:18:22

标签: oracle union

我正在尝试将几个不同宽度的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行产生的正确列数。理想情况下,结果将如下所示。

A 3x3 matrix having labels, content, and row 3 is an integer

我认为这很棘手的部分是使其适用于#1行中的任意宽度或列标签。除了上面的UNION假设之外,还有其他方法吗?谢谢大家。

1 个答案:

答案 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

当然,您通常还是会使用子查询,以便可以在选择单行之前对内部查询进行排序。