SQL-String zu einer Abfrage-Aufgabe
Horst Reinelt
- datenbank
Hallo liebes Forum,
ich habe eine (kleine) Aufgabe für alle SQL-Freaks unter euch, an der ich nun schon einige Zeit sitze, aber einfach nicht auf einen grünen Zweig komme:
T1 besteht aus id, name
T2 besteht aus id, nr
Nun suche ich alle T1.name, die entweder:
eine id-Entsprechung in T2 haben - ausgenommen die Datensätze, deren T2.nr x entsprechen und ausgenommen alle anderen Datensätze mit dieser T2.id -
oder: bei denen die T1.id nicht in T2 vorkommt.
Und das Ganze noch ohne doppelte Einträge (ok, da komme selbst ich drauf: GROUP BY name).
Eindeutiger Schlüssel ist ausschließlich T1.id.
Die folgenden Tabellen ...
+----+------+ T1
| id | name |
+----+------+
| 1 | ich |
| 2 | du |
| 3 | er |
| 4 | sie |
+----+------+
+----+----+ T2
| id | nr |
+----+----+
| 1 | 55 |
| 2 | 55 |
| 2 | 66 |
| 4 | 55 |
| 4 | 77 |
+----+----+
sollen folgende Ergebnisse liefern:
x=55 -> name=er, sie
x=66 -> name=ich, er, sie
x=77 -> name=ich, du, er
Vielen Dank für jede Hilfe und viel Spaß beim Knobeln.
Viele Grüße aus München
Horst
Hallo!
Nun suche ich alle T1.name, die entweder:
eine id-Entsprechung in T2 haben - ausgenommen die Datensätze, deren T2.nr x entsprechen und ausgenommen alle anderen Datensätze mit dieser T2.id -
oder: bei denen die T1.id nicht in T2 vorkommt.
Und das Ganze noch ohne doppelte Einträge (ok, da komme selbst ich drauf: GROUP BY name).
Mhhh, ich kann nicht 100%ig folgen. Vielleicht verstehe ich es besser, wenn Du mal zeigst, welches Ergebnis Du mit Deinem Beispiel erwartest. Welche Datenbank verwendest Du?
MfG, André Laugks
Hallo André!
Mhhh, ich kann nicht 100%ig folgen. Vielleicht verstehe ich es
besser, wenn Du mal zeigst, welches Ergebnis Du mit Deinem
Beispiel erwartest. Welche Datenbank verwendest Du?
MySQL 4.0.13
Ich kann es eben am besten anhand des erwähnten Beispiels erklären:
Die Tabellen ...
+----+------+ T1
| id | name |
+----+------+
| 1 | ich |
| 2 | du |
| 3 | er |
| 4 | sie |
+----+------+
+----+----+ T2
| id | nr |
+----+----+
| 1 | 55 |
| 2 | 55 |
| 2 | 66 |
| 4 | 55 |
| 4 | 77 |
+----+----+
sollen folgende Ergebnisse liefern:
x=55 -> name=er
x=66 -> name=ich, er, sie
x=77 -> name=ich, du, er
("sie" war bei x=55 nicht richtig im ersten Posting)
Die Query müsste so ähnlich wie folgt aussehen:
SELECT T1.name FROM T1 WHERE NOT EXISTS(SELECT * FROM T1, T2 WHERE T1.id=T2.id AND T2.nr=x)
Aber leider ist auch da noch ein Fehler drin - ich bin mir nicht sicher, ob der Syntax "WHERE NOT EXISTS()" so angewendet werden kann.
Danke und viele Grüße
Horst
Hi!
Mhhh, ich kann nicht 100%ig folgen. Vielleicht verstehe ich es besser, wenn Du mal zeigst, welches Ergebnis Du mit Deinem Beispiel erwartest. Welche Datenbank verwendest Du?
Einmal richtig ausschlafen wirkt bei mir Wunder sage ich nur!
SELECT name FROM T1 LEFT JOIN T2 ON (T1.id=T2.id AND T2.nr=x) WHERE T2.id IS NULL;
... macht genau das, was es machen soll.
Ganz ohne Mithilfe gings nicht, aber als mir durch die MySQL-Doku (endlich) klar war, dass Subqueries bei V4.0.x noch nicht unterstützt werden, habe ich dort auch die Umschreibung dafür gefunden.
Trotzdem Danke und
ciao Horst