Выберите Top (некоторое количество) с помощью UNION ALL и ORDER BY - PullRequest
0 голосов
/ 14 августа 2010

Я пытаюсь вернуть пять верхних экземпляров определенных записей, загруженных в таблицу. Важно отметить, что я пытаюсь получить свои результаты из одной таблицы, и я думаю, что есть проблема, которую я не могу понять, связанная с тем фактом, что это одна таблица. Вот пример моего запроса:

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, я получаю только 9 записей, когда знаю, что их должно быть 30. Как я могу убедиться, что я извлекаю все правильные записи? Нужно ли использовать предложение Group By в каждом подзапросе?

Ответы [ 2 ]

6 голосов
/ 14 августа 2010

Более элегантно ..

;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?Это делает бессмысленным предложение ORDER BY ...

1 голос
/ 14 августа 2010

Запустите каждый оператор 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...