簡體   English   中英

Oracle to Sql server:如何重現此select語句?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM