[英]Oracle to Sql server: how to reproduce this select statement?
我有一個在oracle中工作的select語句。 這是對它的外觀的模仿(實際語句是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)
);
因此,基本上,它是同一張表中3種類型的記錄的並集。 外部的“ select * from”將自動添加,並且無法刪除/更改。 順序很重要-必須首先來自第一個子查詢的記錄,然后是來自第二個子查詢的記錄,依此類推。
我需要為sql server重寫它(最好是一條同樣適用於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%'”在現實中要復雜得多,在...(它們必須留在子查詢中)的情況下,我無法以某種外部順序使用它們。
我將不勝感激。
這兩個數據庫都不能保證對結果集的排序(不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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.