Можно ли выбрать один SELECT для получения произвольного числа столбцов, а затем объединить один столбец, за которым следуют нули - PullRequest
0 голосов
/ 01 сентября 2018

Я пытаюсь объединить пару SELECT разной ширины в один результат. В Oracle стандартный SQL, но PL / SQL не разрешен из-за отсутствия у меня разрешений. Запрос примерно как ниже (с примечаниями).

1  SELECT * FROM [FOO] WHERE ROWNUM=1
2  UNION
3  SELECT COUNT(*), {n-1 null columns} FROM [FOO]

Исходная таблица [FOO] подставляется в запрос во время выполнения, число столбцов и метки столбцов заранее произвольны и неизвестны, но строка # 1 запроса просто захватывает их все.

В строке № 3 запроса я хочу заполнить первый столбец целым числом строк таблицы [FOO], за которым следует столько пустых столбцов, сколько необходимо (ширина таблицы минус 1), чтобы заполнить правильный количество столбцов, полученных в строке # 1. Результат в идеале будет выглядеть так.

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

Я думаю, что хитрая часть этого заключается в том, чтобы заставить его работать для произвольной ширины или меток столбца из строки # 1. Есть ли другой подход, кроме гипотезы UNION выше? Спасибо всем.

1 Ответ

0 голосов
/ 01 сентября 2018

Из комментария к предложению добавить столбец, а не строку:

До сих пор я был в тупике, потому что вы не можете смешивать столбцы данных с агрегатными функциями

Вы можете использовать аналитические эквиваленты, хотя. При этом используется таблица departments образца схемы HR, которая имеет 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

Конечно, вы все равно обычно используете подзапрос, чтобы вы могли упорядочить внутренний запрос, прежде чем выделять одну строку.

...