Jump to content

Where-Clause bei Joins


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo zusammen,

 

ich habe ein Problem mit einer einschränkenden Bedingung in einem JOIN. Es wäre toll, wenn jemand eine Antwort dazu hätte.

Ich habe eine Tabelle

CREATE TABLE beziehungen ( 
id int not null,
vater int,
benutzer varchar (30) not null;

in der Bezeihungen zwischen Objekten in den Spalten "id" und "vater" gespeichert werden. "Benutzer" dient dazu zu speichern, wer einen Eintrag angelegt hat. Über einen JOIN lese ich aus, welche Einträge eine id haben, die ihrerseits nicht als vater eingetragen ist. Kurz gesagt, für welches Element sind keine Kindelemente eingetragen. Das Statement ist folgt formuliert:

SELECT 
a.id, a.vater, 
a.benutzer, a.rechner
FROM beziehungen AS a LEFT JOIN beziehungen AS b ON a.id = b.vater
WHERE b.vater Is Null;

Soweit funktioniert das ganze auch so wie es soll. Das Problem ist es, wenn die Tabelle von mehreren Nutzern gefüllt wird, die teils identische Einträge schreiben. Dann ist es möglich, dass ein Element bereits im Kontext eines anderen Nutzers angelegt wurde und daher für den eigenen Nutzer ein falsches Ergebnis durch das SELECT gelifert wird. Mein Lösungsansat war es die WHERE-Clause einzuschränken.

SELECT 
a.id, a.vater, 
a.benutzer, a.rechner
FROM beziehungen AS a LEFT JOIN beziehungen AS b ON a.id = b.vater
WHERE b.vater Is Null AND a.benutzer='meinNutzer';

Leider hat dies auch nicht den gewünschten Erfolgt, da so keine Elemente gefunden werden, die in meinem Nutzerkontext keinen Kinder haben, jedoch in dem Kontext eines anderen Nutzers.

Hat jemand einen Denkanstoß, wie diese Abfrage korrekt formuliert werden müsste, um ausschließlich die Elemente meines Nutzers zu berücksichtigen?

 

Viele Grüße

rodgerwilco

Link zu diesem Kommentar

Hallo und willkommen im Forum.

 

Ein Join auf der gleichen Tabelle?

Was soll eigentlich als Ergebnis rauskommen?

 

Hallo,

das JOIN soll alle die Elemente als Ergebnis liefern, für deren id es einen Eintrag in der Spalte "id" gibt, die aber nicht in der Spalte "vater" eingetragen sind. Das Ganze soll dann eingeschränkt auf einen definierten Nutzernamen sein. Darüber soll ermittelt werden, für welche Elemente bereits Kinder durch einen speziellen Nutzer eingetragen wurden.

Link zu diesem Kommentar

Hier noch ein Beispiel:

id    vater    benutzer
1              user1
2     1        user1
3     1        user1
4     2        user1
1              user2
2     1        user2

Wenn ich jetzt user 1 bin, dann soll das Ergebnis der Datensatz mit id 3 und id 4 sein, da in der Tabelle kein Eintrag existiert, der für diesen Nutzer "user1" in der Spalte vater den wert 3 oder 4 hat. Wenn auf user 2 abgefragt wird, dann soll das Ergebnis der Datensatz mit id 2 sein, da für user2 kein Eintrag mit vater=2 existier.

 

Link zu diesem Kommentar

Dafür gibts einige Wege z.B.:

SELECT 
a.id, a.vater, 
a.benutzer, a.rechner
FROM beziehungen AS a
LEFT JOIN beziehungen AS b
ON a.id = b.vater AND a.benutzer = b.benutzer
WHERE b.vater Is Null

oder

SELECT 
a.id, a.vater, 
a.benutzer, a.rechner
FROM beziehungen AS a
WHERE a.id NOT IN (	SELECT	b.vater 
					FROM	beziehungen b
					WHERE	b.benutzer = a.benutzer )

oder

SELECT 
a.id, a.vater, 
a.benutzer, a.rechner
FROM beziehungen AS a
WHERE a.id NOT EXISTS (	SELECT	1 
						FROM	beziehungen b
						WHERE	b.vater = a.id
						AND		b.benutzer = a.benutzer )
Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

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

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

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

×
×
  • Neu erstellen...