2013-02-15 4 views
0

Je veux insérer une condition dans une de mes requêtes, mais je ne sais pas vraiment comment le faire. Fondamentalement, je suis en train de trier un tas de fichiers par leur dossier _id, c'est-à-dire le dossier auquel ils appartiennent (en utilisant order by folder_id). Ce que je voudrais maintenant, pour chacun de ces groupes de fichiers, est la requête pour choisir le premier fichier qui satisfait une condition particulière. Si cette condition n'est pas satisfaite par l'un des fichiers d'un dossier, la requête doit sélectionner le premier document disponible dans le dossier.SI EXISTE dans la clause WHERE?

C'est ma requête (simplifiée):

select folder_id, 
     file_id, 
     first_name 
from f_file 
where first_name = 'John' 
order by folder_id 

Donc, si mes résultats sont maintenant:

FOLDER ID FILE ID  AUTHOR 
A   32   John 
A   41   John 
A   56   Thomas 
A   78   Peter 
B   02   Peter 
B   03   Peter 
B   45   Peter 
C   34   John 
C   56   Thomas 
C   77   Peter 
C   86   John 
D   12   Peter 
D   34   Thomas 
D   89   Thomas 

pour chaque dossier, je voudrais la requête pour afficher uniquement le premier document (ID_fichier le plus bas) créé par John. S'il n'y a aucun document créé par John du tout dans ce dossier, que le premier de n'importe quel autre auteur fera. Donc, l'ID doit être le plus bas, mais l'auteur doit être John ou un autre. Mon idée serait d'insérer une clause IF EXISTS dans la clause WHERE, mais comment le faire?

Nous vous remercions de vos réponses. Val

+1

Vous devez montrer un exemple dans vos données d'échantillons et les résultats souhaités où John n'a tout simplement pas se produire commodément aussi le plus bas file_id. –

+0

Pour les dossiers B et D, John n'a pas l'ID de fichier le plus bas, donc les premiers documents de Peter sont affichés. –

+0

Je pense que vous avez manqué mon point. Pour B et D, John n'a aucun fichier. Voyez-vous comment un cas d'utilisation potentiel (et peut-être le plus important) manque? Ajoutez John à l'un de ces ensembles, avec un ID de fichier plus élevé. Vos exemples de données doivent montrer comment nous résolvons réellement le problème. C'est comme demander un code qui traite, avec des années bissextiles, mais seulement des données d'échantillon pour avril 2007. –

Répondre

-1

Essayez:

;WITH x AS 
(SELECT folder_id, file_id, author, 
     rn = ROW_NUMBER() OVER (PARTITION BY folder_id 
           ORDER BY case author when 'John' then 1 else 2 end, 
              file_id) 
    FROM f_file 
) 
SELECT folder_id, file_id, author 
FROM x WHERE rn = 1 
ORDER BY folder_id; 
+0

S'il vous plaît, est-ce que le downvoter peut laisser une explication pour le downvote? –