rodgerwilco 0 Geschrieben 2. Juni 2015 Melden Teilen Geschrieben 2. Juni 2015 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 Zitieren Link zu diesem Kommentar
zahni 554 Geschrieben 2. Juni 2015 Melden Teilen Geschrieben 2. Juni 2015 Hallo und willkommen im Forum. Ein Join auf der gleichen Tabelle? Was soll eigentlich als Ergebnis rauskommen? Zitieren Link zu diesem Kommentar
rodgerwilco 0 Geschrieben 2. Juni 2015 Autor Melden Teilen Geschrieben 2. Juni 2015 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. Zitieren Link zu diesem Kommentar
zahni 554 Geschrieben 2. Juni 2015 Melden Teilen Geschrieben 2. Juni 2015 Spontan: select id from table where id not in vater "not in vater" kann auch durch ein Sub-Select ersetzt werden. Zitieren Link zu diesem Kommentar
rodgerwilco 0 Geschrieben 2. Juni 2015 Autor Melden Teilen Geschrieben 2. Juni 2015 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. Zitieren Link zu diesem Kommentar
zahni 554 Geschrieben 2. Juni 2015 Melden Teilen Geschrieben 2. Juni 2015 (bearbeitet) Ich vermute mal, dass Du nach Nested Sets suchst: http://www.klempert.de/nested_sets/ http://de.wikipedia.org/wiki/Nested_Sets Edit: Oder: select id from table where user = 'user1' and id not in vater bearbeitet 2. Juni 2015 von zahni Zitieren Link zu diesem Kommentar
ukulele 11 Geschrieben 2. Juni 2015 Melden Teilen Geschrieben 2. Juni 2015 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 ) Zitieren Link zu diesem Kommentar
rodgerwilco 0 Geschrieben 2. Juni 2015 Autor Melden Teilen Geschrieben 2. Juni 2015 select id from table where user = 'user1' and id not in vater Das war für mich die Lösung. Vielen Dank Hat jemand noch schnell den Unterschied zwischen left join, not in und not exists parat. So wie ich es verstehe ist das Ergebnis in allen Fällen identisch. Zitieren Link zu diesem Kommentar
zahni 554 Geschrieben 2. Juni 2015 Melden Teilen Geschrieben 2. Juni 2015 Das kann durchaus sein. Viele DB-Systeme schreiben Queries intern sowieso um, sol lange das Ergebnis sich nicht ändert und der andere Weg performanter ist. Zitieren Link zu diesem Kommentar
ukulele 11 Geschrieben 3. Juni 2015 Melden Teilen Geschrieben 3. Juni 2015 Bei MSSQL gibt es einen grafischen Ausführungsplan, im Management Studio gibt es dafür einen Button. Den kannst du dir ja mal für die unterschiedlichen Selects anzeigen lassen. Wenn sich ein Unterschied bemerkbar macht dann würde ich tippen das NOT IN die langsammste Variante ist. Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.