Oracle на Sql server: как воспроизвести это утверждение select? - PullRequest
0 голосов
/ 03 июня 2019

У меня есть оператор выбора, который работает в Oracle. Это имитация того, как это выглядит (реальное утверждение - 200+ строк):

select * from (
    select * from (
            select id, name from my_table where name like 'D%' or name like 'Z%' order by name, id)
            union all
    select * from (
            select id, name from my_table where name like 'K%' or name like 'T%' order by name, id)
            union all
    select * from (
            select id, name from my_table where name like 'B%' or name like 'M%' order by name, id)
);

Итак, по сути, это объединение трех типов записей из одной таблицы. Внешний "select * from" добавляется автоматически и не может быть удален / изменен. Порядок важен - записи из первого подзапроса должны быть первыми, затем записи из второго и т. Д.

Мне нужно переписать его для сервера sql (желательно один общий оператор, который работает также в Oracle и SQL Server, но это необязательно)

То, что я пробовал, было:

select * from (
    select * from (
            select id, name, 1 as order_column from my_table where name like 'D%' or name like 'Z%') subquery
            union all
    select * from (
            select id, name, 2 as order_column from my_table where name like 'K%' or name like 'T%') subquery
            union all
    select * from (
            select id, name, 3 as order_column from my_table where name like 'B%' or name like 'M%') subquery
) outerquery order by order_column, name, id;

Порядок сохраняется, но столбец order_column включен в записи результатов, и это неправильно.

Итак, я изменил это на:

select * from (
    select id, name from (
            select id, name, 1 as order_column from my_table where name like 'D%' or name like 'Z%') subquery
            union all
    select id, name from (
            select id, name, 2 as order_column from my_table where name like 'K%' or name like 'T%') subquery
            union all
    select id, name from (
            select id, name, 3 as order_column from my_table where name like 'B%' or name like 'M%') subquery
) parentquery order by order_column, name, id

Но теперь, очевидно, столбец order_column не виден во внешнем запросе и не работает. Как я писал ранее, «select * from» в первой строке не может быть изменено - только внешнее предложение ORDER BY. Кроме того, примеры условий «имя типа« D% »» в действительности намного сложнее, и я не могу использовать их в каком-то внешнем порядке в случае ... случая, когда ... (они должны оставаться в подзапросах)

Буду благодарен за помощь.

1 Ответ

2 голосов
/ 03 июня 2019

Ни одна из баз данных не гарантирует порядок набора результатов без order by.

Почему бы просто не сделать это в любой базе данных?

select id, name, 1 as order_column
from my_table
where name like 'D%' or name like 'Z%' or
      name like 'K%' or name like 'T%' or
      name like 'B%' or name like 'M%'    
order by (case when name like 'D%' or name like 'Z%' then 1
               when name like 'K%' or name like 'T%' then 2
               when name like 'B%' or name like 'M%' then 3
          end)

В SQL Server вы можете упростить это до:

select id, name, 1 as order_column
from my_table
where name like '[DZKTBM]%'  
order by (case when name like '[DZ]%' then 1
               when name like '[KT]%' then 2
               when name like '[BM]%' then 3
          end)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...