2009-05-29 10 views
0

Angenommen, ich habe eine Ergebnismenge, die einen oder mehrere Werte enthalten kann, aber ich möchte immer nur einen Wert im Ergebnis haben, und bestimmte Werte sind mehr wert als andere.Wie erstelle ich eine übliche Rangfolge meiner Ergebnismenge in SQL?

Wie würde ich das in SQL lösen, damit ich es in einer Unterabfrage verwenden kann?

Beispiel (T-SQL-spezifisch, das ist der Akzent I mit arbeiten):

Ich habe eine Tabelle:

tChore(ChoreId int primary key, ChoreDescription nvarchar(15)) 

, die mit allen Arten von Aufgaben belastet wird. Ich habe auch eine andere Tabelle:

tDayChores(
    DayId int primary key, 
    ChoreId int foreign key references tChore(ChoreId) 
) 

, die mit Tag und Aufgaben in einer Viele-zu-viele-Beziehung geladen wird.

Es gibt natürlich eine dritte Tabelle, die den Namen aller Wochentage enthält.

Jetzt sagen wir, ich möchte einen und nur einen Tag zum Vakuum bekommen. Ich mache es lieber mittwochs, aber wenn das nicht geplant ist, würde ich es gerne donnerstags machen, und wenn das nicht geplant ist, ist es egal, jeder Tag ist in Ordnung.

Eine Möglichkeit, die Ergebnismenge zu begrenzen, um eine Reihe wäre, dies zu tun:

select top(1) 
    DayId 
from 
    tDayChores DC 
    inner join tChore C 
     on C.ChoreId = DC.ChoreId 
where 
    C.ChoreDescription = 'vacuum' 

Wenn jedoch Vakuum für Montag und Mittwoch geplant ist, dann würde ich Montag als Ergebnis erhalten, und ich d mag es, am Mittwoch den höchsten Rang zu erreichen.

+0

Können Sie Ihre Antwort löschen und dieses Detail der Frage selbst hinzufügen –

+0

Sicher, aber es schien richtiger, den Lösungsvorschlag im Antwortteil zu behalten. Schaut OK aus? –

Antwort

0

Hier ist eine Lösung, die eine Unterabfrage mit:

select top(1) 
    t.DayId 
from (
     select 
      DayId, 
      case 
       when DayId = 3 then 1 -- DayId: 3 = Wednesday 
       when DayId = 4 then 2 -- DayId: 4 = Thursday 
       else 3 
      end DayRank 
     from 
      tDayChores DC 
      inner join tChore C 
       on C.ChoreId = DC.ChoreId 
     where 
      C.ChoreDescription = 'vacuum' 
    ) t 
order by t.DayRank 

Der Tag Rang stellt sicher, dass Mittwoch und Donnerstag vor jedem anderen Tag sortiert werden, und dann wählen Sie einfach die oberste.

Verwandte Themen