Guybrush Threepwood Geschrieben 8. November 2007 Teilen Geschrieben 8. November 2007 Mal angenommen ich habe folgende Beispieltabelle [ID] [Person] [Datum] [Wert] 1 A 1.11.07 xy 2 A 3.11.07 ab 3 B 1.11.07 xy 4 B 5.11.07 xy 5 B 1.10.07 ab 6 C 2.11.07 tz 7 C 3.11.07 xy 8 A 1.11.07 rt 9 C 2.11.07 iu 10 D 7.11.07 xy [/PHP] ich möchte jetzt alle Personen haben wo kein Wert xy mit dem Datum ab dem 5.11.07 existiert. Also müsste in der Ergebnismenge A und C enthalten sein. Aber wie muss dazu die SQL Anweisung aussehen? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jan Jansen Geschrieben 8. November 2007 Teilen Geschrieben 8. November 2007 Zerleg die Anforderung in 2 Teile und pack beide eine gemeinsame Abfrage 1. Nehme alle Personen für die ein Satz xy mit Datum >= 5.11 existiert 2. Nehme alle Personen die nicht in der ersten Abfrage gefunden wurden Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 8. November 2007 Autor Teilen Geschrieben 8. November 2007 hmm wenn das geht wäre das eine Möglichkeit. Aber ist das nicht ziemlich ineffizient? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jan Jansen Geschrieben 8. November 2007 Teilen Geschrieben 8. November 2007 lösen könnte man es mit except oder einem not in (wähle alle Personen) where Person not in (wähle alle Personen für die ein Satz 'xy' mit Datum >= 5.11 existiert) (wähle alle Personen) except (wähle alle Personen für die ein Satz 'xy' mit Datum >= 5.11 existiert) versuch mal beide Varianten und schau was schneller geht, auf Anhieb fällt mir keine wirklich schnellere Methode ein Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Bogomip Geschrieben 8. November 2007 Teilen Geschrieben 8. November 2007 Mal angenommen ich habe folgende Beispieltabelle [ID] [Person] [Datum] [Wert] 1 A 1.11.07 xy 2 A 3.11.07 ab 3 B 1.11.07 xy 4 B 5.11.07 xy 5 B 1.10.07 ab 6 C 2.11.07 tz 7 C 3.11.07 xy 8 A 1.11.07 rt 9 C 2.11.07 iu 10 D 7.11.07 xy [/PHP] ich möchte jetzt alle Personen haben wo kein Wert xy mit dem Datum ab dem 5.11.07 existiert. Also müsste in der Ergebnismenge A und C enthalten sein. Aber wie muss dazu die SQL Anweisung aussehen? Hmmm, wenn ich das richtig sehe, kommt da nichts vernünftiges bei heraus. Es gibt genau zwei Datensätze, die das Datum größer gleich 05.11.07 haben, Datensatz 4 und 10. Beide Datensätze haben aber xy als Wert. Ergebnis = 0 Datensätze. Aber um das mal aufzugreifen: SELECT Person, Datum, Wert FROM Tabellenname WHERE Datum>=05.11.2007 AND Not Wert=xy Gruß Bogomip Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 8. November 2007 Autor Teilen Geschrieben 8. November 2007 @Bogomip nein du hast die Problemstellung falsch verstanden. Es soll keiner dieser Datensätze als Ergebnis rauskommen. Sondern die Personen wo kein Datensatz mit dem Wert xy und einem Datum ab dem 5.11.07 existiert. Die Lösung von Jan Jansen sollte das eigentlich machen, ich kanns leider noch nicht probieren weil ich mir nur vorab schonmal Gedanken um eine Problemstellung mache die ich bald lösen muss. Bin aber trotzdem für weitere Vorschläge dankbar Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Cobinja Geschrieben 8. November 2007 Teilen Geschrieben 8. November 2007 Wie wär's damit: SELECT DISTINCT Person FROM Tabellenname WHERE Datum < 5.11.07 AND Wert <> 'xy' Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 8. November 2007 Autor Teilen Geschrieben 8. November 2007 lösen könnte man es mit except oder einem not in (wähle alle Personen) where Person not in (wähle alle Personen für die ein Satz 'xy' mit Datum >= 5.11 existiert) (wähle alle Personen) except (wähle alle Personen für die ein Satz 'xy' mit Datum >= 5.11 existiert) versuch mal beide Varianten und schau was schneller geht, auf Anhieb fällt mir keine wirklich schnellere Methode ein Ich hab das jetzt doch mal mit ein paar anderen Daten simuliert und das funktioniert beides, wobei man sich bei dem except das GROUP BY Person sparen kann. Welches jetzt schneller ist kann ich aber nicht sagen da nur ca 1400 Datensätze in der Tabelle waren und beides somit sehr schnell war. EDIT: Wie wär's damit: SELECT DISTINCT Person FROM Tabellenname WHERE Datum < 5.11.07 AND Wert <> 'xy' Nein das passt ja auch nicht zur Problemstellung da es lediglich alle Personen liefert die diesen Datensatz vor dem 5.11 haben und nicht die die ihn nicht ab dem 5.11 haben. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 8. November 2007 Teilen Geschrieben 8. November 2007 SELECT DISTINCT person FROM tabelle WHERE person NOT IN (SELECT person WHERE Datum >=5.11.07 AND wert ='xy') Dim Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Cobinja Geschrieben 8. November 2007 Teilen Geschrieben 8. November 2007 Tschuldigung, Ich hatte "bis" gelesen. Bei meinem Statement also einfach das < durch >= ersetzen, dann sollte es passen: SELECT DISTINCT Person FROM Tabellenname WHERE Datum >= 5.11.07 AND Wert <> 'xy' Damit bekommst du alle Personen, die ab dem 5.11.07 den Wert 'xy' nicht haben. Oder willst du alle Personen haben, bei denen es einen Eintrag nach dem 05.11.07 gibt, bei denen aber auch vor dem 05.011.07 kein 'xy' auftaucht? Dann geht folgendes Statement: SELECT DISTINCT Person FROM Tabellenname WHERE id IN (SELECT id FROM Tabellenname WHERE Wert <> 'xy') AND Datum >= 5.11.07 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 9. November 2007 Autor Teilen Geschrieben 9. November 2007 Damit bekommst du alle Personen, die ab dem 5.11.07 den Wert 'xy' nicht haben. Nein das passt genauso wenig zur Problemstellung wie das andere. Damit lieferst du nur alle Datensätzte die auch andere Werte als xy ab dem 5.11 haben, aber nicht die die xy nicht haben. Letzteres macht bisher nur Jan Jansens Lösung (und die von dimitri weils ja praktisch die Selbe ist). Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.