从排序表中联合选择

时间:2018-08-07 04:50:04

标签: sql sql-server sql-order-by union

我想从一个已排序的表中同时执行几个SELECT。我的想法如下:

SELECT TOP 5 * FROM unsorted_table where parameter1 = 1 ORDER BY parameter2 DESC, paramter3 DESC, parameter4 ASC
UNION
SELECT TOP 5 * FROM unsorted_table where parameter1 = 2 ORDER BY parameter2 DESC, paramter3 DESC, parameter4 ASC

但是由于ORDER BY,它显然不起作用。我也尝试过,但是没有成功:

SELECT TOP 5 * FROM (SELECT * FROM unsorted_table where where parameter1 = 1 ORDER BY parameter2 DESC, paramter3 DESC, parameter4 ASC)
UNION
SELECT TOP 5 * FROM (SELECT * FROM unsorted_table where where parameter1 = 2 ORDER BY parameter2 DESC, paramter3 DESC, parameter4 ASC)

如果我使用了以下内容(如此处其他线程所建议的那样),则我得不到所需的东西,因为该表是在末尾排序的:

SELECT TOP 5 * FROM unsorted_table WHERE parameter1 = 1
UNION
SELECT TOP 5 * FROM unsorted_table WHERE parameter1 = 2
ORDER BY parameter2 DESC, paramter3 DESC, parameter4 ASC

另一个限制是,我不能创建新表。因此,将排序后的表保存到新表中并从中选择也是不能的。

3 个答案:

答案 0 :(得分:0)

使用子查询尝试此操作:

select * from 
(SELECT TOP 5 * FROM unsorted_table WHERE parameter1 = 1
UNION
SELECT TOP 5 * FROM unsorted_table WHERE parameter1 = 2)a
ORDER BY parameter2 DESC, paramter3 DESC, parameter4 ASC

答案 1 :(得分:0)

尝试使用WITH:

WITH xy AS (
SELECT TOP 5 * 
  FROM unsorted_table 
 WHERE parameter1 = 1 ORDER BY parameter2 DESC, paramter3 DESC, parameter4 ASC
),
yz AS (
SELECT TOP 5 * 
  FROM unsorted_table 
 WHERE parameter1 = 2 ORDER BY parameter2 DESC, paramter3 DESC, parameter4 ASC
)
SELECT * FROM xy
UNION
SELECT * FROM yz

答案 2 :(得分:0)

您似乎想要:

select u.*
from (select *, row_number() over (partition by parameter1 order by parameter2 desc, paramter3 desc, parameter4) seq
      from unsorted_table 
      where parameter1 in (1,2)
     ) u
where seq <= 5;