2009-06-25 7 views
1

J'utilise SQL Server 2008. J'ai une table composée de trois colonnes, ID comme type de chaîne, createtime comme type DataTime et status comme int.comment écrire une instruction select comme ça?

Je veux sélectionner l'enregistrement parmi tous les enregistrements dont la valeur d'état est 10 et en même temps, creattime est la plus écoutée. Des idées comment écrire une telle requête? BTW: ID est un index clusterisé et j'ai aussi un index sur la colonne createtime.

merci à l'avance, George

Répondre

9
SELECT TOP 1 * 
FROM table 
WHERE status = 10 
ORDER BY created 
+2

comme une bonne règle, ne jamais utiliser * (tous) ... toujours spécifier les champs – balexandre

+0

@balexandre: Tu as raison ... Je sais ...: –

+2

Pour ceux qui sont trop paresseux pour écrire tous les champs un par un, écrivez l'instruction sélectionnez * à partir du tableau puis marquez le texte et cliquez droit sur "Design Query in Editor" après que seulement cliquez sur OK, Visual studio énumérera les noms de tous les fichiers sélectionnés déclaration – adopilot

5
select top 1 ID, 
      CreateTime, 
      Status 
from   SourceTable 
where  Status  = 10 
order by  CreateTime 
-1
SELECT 
TOP 1 * FROM table WHERE VALUE = 10 
ORDER BY createtime 
+0

orderby quoi? Votre déclaration est incomplète et a une syntaxe invalide. –

+0

désolé, avait createtime dans le style de tag html, n'a pas été montré dans la réponse .. – Colin

3
SELECT TOP 1 id, createtime, status 
FROM mytable 
WHERE status = 10 
ORDER BY 
     createtime 
0

Comment cela?

;WITH OrderedRows 
AS 
(SELECT ID, CreateTime, Status, ROW_NUMBER() OVER (ORDER BY CreateTime ASC) AS RowNumber 
FROM MyTable 
WHERE Status = 10) 
SELECT * FROM OrderedRows 
WHERE RowNumber = 1 
+0

Pourquoi était-ce downvoted sans fournir une explication? Ceci est une réponse correcte. –

2

Je ne suis pas familier avec SQL Server, en particulier, mais vous devriez être en mesure de le faire avec une sous-sélection:

SELECT * 
FROM Table t1 
WHERE status = 10 AND createtime = (
    SELECT min(createtime) 
    FROM Table t2 
    WHERE status = 10 
); 
2

Je préfère la réponse de Arjan mais si vous aviez plusieurs critères avec le " première rangée créée "partie de la sélection alors je voudrais regarder sous-requêtes par exemple

SELECT * 
FROM table 
WHERE status = 10 
AND created = (SELECT MIN(created) 
       FROM table 
       WHERE status = 10)) 

Bien que cela va essentiellement 2 requêtes et est non nécessaire à vos besoins, il vous donne plus de contrôle si vous avez plus de critères pour travailler.

HTH

Oneshot

Questions connexes