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?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie die folgende Abfrage erhalten Sie eine Liste der Anwendungen, die NICHT nur ein Feiertag definiert, die für das AKTUELLE Datum.
Im Grunde, was wir tun müssen, ist wählen Sie alles, wo Sie nicht übereinstimmen.
OK, einfach nur anders zu sein, wie wäre es mit etwas wie dieses:
Im Grunde hast du die Tabellen verknüpfen, basierend auf applicationid und das aktuelle Datum. Da es ein left join, erhalten Sie immer alle Anwendungen, match @appname, dann haben Sie gerade den filter heraus keine Ergebnisse, die erhalten ein Spiel basiert auf den Urlaub Datum wird das aktuelle Datum. Unter der Annahme, dass applicationname ist einzigartig, erhalten Sie immer eine einzelne Zeile, wo die Rechte Hälfte des join ist null, es sei denn, das aktuelle Datum mit einem Urlaub, in dem Fall die Abfrage keine Ergebnisse.
Ich weiß nicht, wie es stapelt sich mit den anderen Lösungen performance-Weise, ich glaube, joins sind in der Regel soll schneller sein als die sub-queries, aber das hängt wahrscheinlich von einer Vielzahl von Faktoren ab, so YMMV.
Können Sie "WHERE not EXISTS":
Mache ich den cast dort zum abschneiden der getdate () - Aufruf zurück, um nur das Datum. Getestet noch nicht, die genaue Abfrage aber ich denke, es wird die Arbeit für Sie erledigen.
Etwas wie das hier tun:
Natürlich wäre es viel einfacher und schneller als mit SQL Server 2008 die "DATE" - Datentyp ist, oder wenn Sie die Speicherung von Tag, Monat, Jahr in "Urlaub" getrennt.
Marc
Was über diese:
"'app1'" sollte ersetzt werden durch eine Variablen-Bezeichner und "CurrentDate ()", die durch das system bestimmte Funktion, um das aktuelle Datum.
Cheers
/a