2010-08-14 6 views
0

Je tente de retirer les cinq premières instances de certains enregistrements chargés dans une table. Il est important de noter que j'essaie de faire ressortir mes résultats de la même table et je pense qu'il y a un problème que je n'arrive pas à comprendre en rapport avec le fait qu'il s'agit d'un tableau. Voici l'exemple de ma requête:Sélectionnez Haut (un certain nombre) avec UNION ALL et ORDER BY

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 

Quand je lance c'est SQL Server je n'obtenir 9 dossiers quand je sais, en fait, qu'il devrait y avoir 30. Comment puis-je faire en sorte que je tire en arrière tous les enregistrements corrects? Dois-je utiliser une clause Group By dans chaque sous-requête?

+1

Êtes-vous sûr qu'il y a au moins 5 travaux pour * chaque * JobID'? –

+0

Après Nick Craver, je courais chacun individuellement. Et vous voulez dire ORDER BY JobID aussi? – gbn

+0

Chaque ID de travail a atleast 5 enregistrements, seulement alors il renverra 30. –

Répondre

6

Plus élégant ..

;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 

Pourquoi avez-vous à la fois WHERE et ORDER par JobID? Cela rend la clause ORDER BY dénuée de sens ...

+0

S'il vous plaît voir mon edit à la requête ci-dessus, je l'ai écrit trop hâtivement. Merci d'avoir signalé cette erreur. – AndHeCodedIt

1

Exécuter de chaque déclaration SELECT séparément et voir si vous obtenez 5 lignes pour chaque

Exécuter ce pour voir le comptage pour chaque deuxième colonne retournée sera le 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 

vous pouvez également exécuter comme celui-ci

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

Je ne sais pas vraiment, est-ce que cela pourrait affecter pourquoi je n'obtiens pas tous les résultats que j'attends? En d'autres termes, pour jobID = 1, je sais que je suis supposé obtenir 5 résultats, et quand j'exécute la requête par elle-même, je récupère les résultats. Cependant quand je cours la requête entière énumérée ci-dessus j'obtiens 5 lignes totalement différentes. – AndHeCodedIt

+0

quelle est la sortie que vous obtenez, devrait être 6 lignes – SQLMenace

Questions connexes