Zum Inhalt springen

SQL: Fehlende Zeilen finden


Guybrush Threepwood

Empfohlene Beiträge

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

@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 :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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).

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...