SQL-Abfrage, um Datensätze auszuschließen, wenn ein entsprechender Eintrag in einer anderen Tabelle (z.B. Urlaub, Termine)

Ich habe zwei Tabellen:

Anwendung

applicationid (int)

applicationname (varchar)

isavailable (bit)

und

Urlaub

applicationid (int)

holidaydate (datetime)

Ich brauche, um die isavailable Flagge für einen bestimmten applicationname sollte es aber nur zurück, wenn der Tag, wenn kein Urlaub ist. Die isavailable flag ist unabhängig von Urlaub - es ist nur gesetzt, wenn es gibt systemweite Probleme verursachen, die nicht auf einen Zeitplan festlegen.

Hatte ich anfangs so etwas wie:

select top 1 apps.isavailable
from dbo.Applications apps, dbo.Holidays hol
where apps.applicationid = hol.applicationid and
      apps.applicationname = @appname and
      ((datediff(dd,getdate(),hol.holidaydate)) != 0)

aber das wurde wieder Datensätze, auch wenn heute ein Feiertag war, weil die anderen urlaubstermin nicht gleich heute.

Versuchte ich

and (CONVERT(VARCHAR,getdate(),101)) not in (CONVERT(VARCHAR,hol.holidaydate,101))

(es ist auf SQL Server 2005, so gibt es kein Datum geben, so habe ich es zu konvertieren)

aber wieder, es wurde wieder Datensätze, auch wenn heute ein Feiertag war. Wie kann ich die Struktur dieser Abfrage mit einem "nicht da" oder "außer" - Klausel (oder etwas anderes) nur die Rückgabe eines Datensatzes, wenn heute nicht ein Feiertag?

Update

Brauche ich nicht eine Liste aller applicationnames, die keinen Urlaub - ich brauche ein Datensatz für den angegebenen apps.applicationname. Die Antworten unten nur die Rückkehr der Anwendung, die Namen, die nicht mit einem Urlaub auf den heutigen Tag. Die Abfrage zurückgeben soll die isavailable Flagge, wenn es ist kein Urlaub, oder sonst keine Datensätze zurückgeben, wenn es ein Feiertag ist. Ich kümmern sich nicht, über die anderen Anwendungen.

Außerdem, was ist, wenn ich fügte hinzu, ein Tisch wie:

HoursOfOperations

applicationid (int)

mondayopen (datetime)

mondayclose (datetime)

tuesdayopen (datetime)

tuesdayclose (datetime)

//öffnen und schließen für alle sieben Tage der Woche

Konnte ich join über alle drei Tabellen, um nur die Rückgabe eines Datensatzes, falls es innerhalb von die Stunden für den Tag und ist nicht ein Feiertag? Muss ich dazu in separate Abfragen?

InformationsquelleAutor Tai Squared | 2009-04-02
Schreibe einen Kommentar