使用UNION ALL和ORDER BY选择Top(某个数字)

时间:2010-08-14 11:29:36

标签: sql sql-server sql-server-2005 tsql

我试图拉回加载到表中的某些记录的前五个实例。重要的是要注意我试图从同一个表中得到我的结果,我认为有一个问题,我无法弄清楚这是一个表的事实。以下是我的查询示例:

Select * From (
Select Top 5 JobID From Jobs Where JobTypeID = 1 Order By JobID DESC
UNION ALL
Select Top 5 JobID From Jobs Where JobTypeID = 2 Order By JobID DESC
UNION ALL
Select Top 5 JobID From Jobs Where JobTypeID = 3 Order By JobID DESC
UNION ALL
Select Top 5 JobID From Jobs Where JobTypeID = 4 Order By JobID DESC
UNION ALL
Select Top 5 JobID From Jobs Where JobTypeID = 5 Order By JobID DESC
UNION ALL
Select Top 5 JobID From Jobs Where JobTypeID = 6 Order By JobID DESC
) As UnionTable

当我运行这是SQL Server时,我只知道应该有30条记录。我怎样才能确保撤回所有正确的记录?我是否需要在每个子查询中使用Group By子句?

2 个答案:

答案 0 :(得分:6)

更优雅..

;WITH cte AS
(
    SELECT
         JobID, 
         ROW_NUMBER() OVER (PARTITION BY JobTypeID ORDER BY JobID /* eh? */ DESC) AS rank
    FROM
         Jobs WHERE JobTypeID BETWEEN 1 AND 6
)
SELECT * FROM CTE WHERE rank <= 5

为什么你有JobID的WHERE和ORDER?这使得ORDER BY子句毫无意义......

答案 1 :(得分:1)

分别运行每个SELECT语句,看看每个

是否有5行

运行此项以查看每个的计数,返回的第二列将是JobID

Select COUNT(*),1 From Jobs Where JobID = 1 
UNION ALL
Select COUNT(*),2 From Jobs Where JobID = 2 
UNION ALL
Select COUNT(*),3 From Jobs Where JobID = 3 
UNION ALL
Select COUNT(*),4 From Jobs Where JobID = 4 
UNION ALL
Select COUNT(*),5 From Jobs Where JobID = 5 
UNION ALL
Select COUNT(*),6 From Jobs Where JobID = 6 

您也可以像这样运行

Select COUNT(*),JobID
 From Jobs 
 Where JobID between 1 and 6 
 GROUP By JobID