2009-06-25 14 views
1

Ich verwende SQL Server 2008. Ich habe eine Tabelle, die aus drei Spalten besteht, ID als String-Typ, createtime als DataTime-Typ und Status als int.Wie schreibe ich Select-Anweisung wie folgt?

Ich möchte den Datensatz unter allen Datensätzen auswählen, deren Statuswert 10 ist und gleichzeitig createtime die meiste Earlist ist. Irgendwelche Ideen, wie man solche Fragen schreibt?

BTW: ID ist Clustered-Index und ich habe auch Index auf createtime Spalte.

Vielen Dank im Voraus, George

Antwort

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

als eine gute Faustregel nie verwenden * (alle) ... immer geben die Felder – balexandre

+0

@balexandre: Du hast Recht ... ich weiß ...:) –

+2

Für diejenigen, die zu faul ist, alle Felder einzeln zu schreiben schreiben Anweisung * aus Tabelle markieren dann Text markieren und mit der rechten Maustaste auf "Design Query im Editor" klicken, danach nur auf OK klicken, Visual Studio wird die Namen aller ausgewählten Felder aufzählen Anweisung – 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

Bestellungvon was? Ihre Aussage ist unvollständig und hat eine ungültige Syntax. –

+0

Sorry, hatte Createtime in HTML-Tag-Stil, wurde nicht in der Antwort gezeigt. – Colin

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

Wie wäre das?

;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

Warum wurde dies ohne Erklärung abgelehnt? Dies ist eine korrekte Antwort. –

2

Ich bin mit SQL Server nicht vertraut, und zwar, aber man sollte es zu tun mit einem subselect fähig sein:

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

Ich ziehe Antwort Arjans aber wenn Sie mit mehreren Kriterien haben die " früheste erstellte Zeile "Teil der Auswahl dann würde ich Unterabfragen z

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

Während dies läuft im Wesentlichen zwei Abfragen und ist un-nötig für Ihre Anforderungen es Ihnen mehr Kontrolle gibt, wenn Sie mehrere Kriterien für die Arbeit mit.

HTH

OneShot