Anzeige:
Ergebnis 1 bis 13 von 13

Thema: JOIN-Problem

  1. #1
    Registrierter Benutzer
    Registriert seit
    20.11.2004
    Beiträge
    13

    Question JOIN-Problem

    Hallo User,

    habe eine Frage zu einem SQL-Query welches ich auf einer MS SQL-DB ausführen möchte.

    Habe 2 Tabellen mit JOIN verbunden und frage alle Datensätze ab, bei denen die ID_user = x ist.

    SELECT * FROM tbl_permissions left join tbl_hyperlinks on tbl_permissions.ID_hyperlink = tbl_hyperlinks.ID WHERE ID_user = x

    Jetzt kann ich alle Datensätze ausgeben lassen, bei denen beide Tabellen verbunden sind und die ID_user = x ist.


    Und hier mein Problem: Wie bekomme ich die Datensätze zurück, bei denen es keine Verknüpfung zwischen den Tabelleb gibt?


    Wäre für eine Lösung zu meinem Problem sehr dankbar.

    Gruß,
    imm0rt4l

  2. #2
    Registrierter Benutzer Avatar von ExRevel
    Registriert seit
    08.11.2004
    Ort
    Stuttgart
    Beiträge
    33
    Hm, wie wärs hiermit? Anschaulich ist der 'ON' Bereich im JOIN doch nur wie eine WHERE Klausel. (Anschaulich, ich will das nicht an sich vergleich )
    Code:
    SELECT * FROM tbl_permissions left join tbl_hyperlinks on tbl_permissions.ID_hyperlink <> tbl_hyperlinks.ID WHERE ID_user = x
    ciao Exi
    The CodeWars Project (Coding Contest for AI Buffs)

  3. #3
    Registrierter Benutzer Avatar von elrond
    Registriert seit
    03.10.2001
    Ort
    potsdam
    Beiträge
    881
    ich würd's so versuchen:

    Code:
    SELECT * FROM tbl_permissions left join tbl_hyperlinks on tbl_permissions.ID_hyperlink = tbl_hyperlinks.ID WHERE ID_user = x and tbl_hyperlinks.ID is null
    PS: SQL-Code wird lesbarer wenn man Aliasnamen für die Tabellen verwendet :
    Code:
    SELECT * FROM tbl_permissions p left join tbl_hyperlinks l on l.ID_hyperlink = p.ID WHERE p.ID_user = x and l.ID is null
    Geändert von elrond (25-11-2004 um 16:38 Uhr)
    "Um die Welt zu ruinieren, genügt es, wenn jeder seine Pflicht tut." (Winston Churchill)

  4. #4
    Registrierter Benutzer Avatar von Hans-Georg Normann
    Registriert seit
    04.03.2000
    Ort
    Uetersen
    Beiträge
    571
    Also Elronds Vorschlag würde ich aufnehmen und das ganze so darstellen
    Code:
    SELECT * 
    FROM tbl_permissions p left outer join tbl_hyperlinks l on (
       l.ID_hyperlink = p.ID
    )
    WHERE p.ID_user = x
    Oder ist das in MS SQL nicht möglich?

    Hans
    333 Mhz, 466 MHz, neee, ich hab was neues zuhause.....

  5. #5
    Registrierter Benutzer Avatar von elrond
    Registriert seit
    03.10.2001
    Ort
    potsdam
    Beiträge
    881
    wenn das Ziel wirklich war die zeilen OHNE Verknüpfung darzustellen ist das hier notwendig:

    Code:
    ... and l.ID is null
    "Um die Welt zu ruinieren, genügt es, wenn jeder seine Pflicht tut." (Winston Churchill)

  6. #6
    Registrierter Benutzer
    Registriert seit
    20.11.2004
    Beiträge
    13

    Unhappy Problem besteht noch

    Hallo User,

    danke für die vielen Tipps, doch leider besteht mein Problem noch immer.
    Kann gut sein, dass ich mich schlecht ausgedrückt habe - aus diesem Grunde habe ich eine kleine Grafik erstellt, um alle Klarheiten zu beseitigen!




    So, was ich jetzt ausgeben möchte, sind die Datensätze der Tabelle tbl_hyperlinks, die nicht verknüpft sind.
    Hier z.B.: 3, 5, 7, 8

    Habe die Vorschläge von euch ausprobiert, haben leider nicht funktioniert.

    Für einen Lösungsvorschlag wäre ich sehr Dankbar.


    Gruß,
    imm0rt4l

  7. #7
    Registrierter Benutzer
    Registriert seit
    24.12.2001
    Ort
    anywhere before EOF
    Beiträge
    236
    So vielleicht:
    Code:
    -- Sollte auf jeden Fall funktionieren ist nur ggf. etwas langsam...
    SELECT *
    FROM tbl_hyperlinks h
    WHERE h.id NOT IN (SELECT p.id_masterlink
                       FROM tbl_permissions p);
    
    -- Sollte auch funktionieren und schneller sein...
    SELECT *
    FROM tbl_hyperlinks h
    WHERE NOT EXISTS (SELECT p.id_masterlink
                      FROM tbl_permissions p
                      WHERE p.id_masterlink = h.id);
    
    -- Ist vielleicht sogar noch etwas schneller, musst du ausprobieren,
    -- geht allerdings nicht wenn sich mehrere Datendätze in `tbl_masterlink` auf
    -- eine ID beziehen, weil Single Row Subquery...
    SELECT *
    FROM tbl_hyperlinks h
    WHERE (SELECT p.id_masterlink
           FROM tbl_permissions p
           WHERE p.id_masterlink = h.id) IS NULL;
    Ist halt jetzt ohne irgenein gejoine. Hoffe das ist nicht wichtig, ich hab zwar mal irgendwo von so ner Möglichkeit gelesen praktisch "negativ" zu joinen aber weiss nicht mehr wo das stand oder wie das ging...
    chmod -R +t /*

  8. #8
    Registrierter Benutzer
    Registriert seit
    26.12.2002
    Ort
    Matrix
    Beiträge
    194
    Zitat Zitat von sticky bit
    -- Sollte auf jeden Fall funktionieren ist nur ggf. etwas langsam...
    SELECT *
    FROM tbl_hyperlinks h
    WHERE h.id NOT IN (SELECT p.id_masterlink
    FROM tbl_permissions p);
    "auf jeden fall" auf jeden fall nicht. die subquery darf _keine_ NULL-werte zurückgeben.


    -j
    Geändert von Jasper (27-11-2004 um 21:07 Uhr)

  9. #9
    Registrierter Benutzer
    Registriert seit
    24.12.2001
    Ort
    anywhere before EOF
    Beiträge
    236

    aha...

    Mag sein dass er es gemäss irgendeines der SQL-Standards nicht darf, da muss ich ganz ehrlich gesagt passen, aber bei vielen DBMS tut er es trotzdem und wenn ich mich nicht ganz schwer täusche gehöhrt das Microsoftsche um dass es ja letztendlich geht da mit zu! Mit Postgres geht es da hab ichs gerade extra noch mal probiert, an ne MS SQL komm ich jetzt von hier nicht ran aber wie gesagt da bin ich mir ziemlich sicher!
    Ausserdem das was du gequoted hast, da sollten gar keine NULLs im Subquery drinne sein, zumindest geh ich anhand des Beispiels davon aus, dass keine NULL FKs da drinne sind, aber da kann ich mich täuschen...
    Sieht mit dem letzten Query, den du wahrscheinlich eigentlich meintest aber genaus so aus wie eingangs erwähnt.
    Geändert von sticky bit (28-11-2004 um 05:13 Uhr)
    chmod -R +t /*

  10. #10
    Registrierter Benutzer
    Registriert seit
    26.12.2002
    Ort
    Matrix
    Beiträge
    194
    Zitat Zitat von sticky bit
    Ausserdem das was du gequoted hast, da sollten gar keine NULLs im Subquery drinne sein, zumindest geh ich anhand des Beispiels davon aus, dass keine NULL FKs da drinne sind, aber da kann ich mich täuschen...
    Sieht mit dem letzten Query, den du wahrscheinlich eigentlich meintest aber genaus so aus wie eingangs erwähnt.
    ich meinte schon die "NOT IN"-variante. bei diesem anti-join erhält man falsche resultate, wenn NULL-werte im spiel sind. auf diese einschränkung wollte ich nur hinweisen.

    auch wenn der OP schrieb, dass die lösung von elrond (left outer join) nicht funktionieren würde, sie tut es.


    -j

  11. #11
    Registrierter Benutzer Avatar von Hans-Georg Normann
    Registriert seit
    04.03.2000
    Ort
    Uetersen
    Beiträge
    571
    Code:
    -- Sollte auf jeden Fall funktionieren ist nur ggf. etwas langsam...
    SELECT *
    FROM tbl_hyperlinks h
    WHERE h.id NOT IN (
       SELECT p.id_masterlink
       FROM tbl_permissions p
       WHERE NOT p.id_masterlink IS NULL);
    hmm, und das geht etwa nicht? (Habe es selbst nicht ausgetestet)

    Hans
    333 Mhz, 466 MHz, neee, ich hab was neues zuhause.....

  12. #12
    Registrierter Benutzer
    Registriert seit
    24.12.2001
    Ort
    anywhere before EOF
    Beiträge
    236
    @Jasper:
    Ich glaub ich weiss jetzt was du meinst:
    Wenn, um bei diesem Beispiel zu bleiben in der Tabelle ` tbl_hyperlinks` in der Spalte `id` ein oder mehrere NULLs sind, dann wird der entsprechende Record auch angezeigt, wenn in der Tabelle `tbl_permissions` in der Spalte `id_masterlink` NULL Werte vorhanden sind.
    Wenn du das meintest, haste recht, zumindest auf der Postgre wo ich es getestet habe geht das nicht, bei der Microsoft werde ich es bei Gelegenheit mal testen wenn ich wieder in der Firma bin, wird aber wohl genauso aussehen.
    Ansowas habe ich ehrlich gesagt nicht gedacht. Wie auch immer , ne Spalte die `id` heisst lässt auf PK vermuten da gehöhren eh keine NULLs rein... :P Aber ansonsten haste recht!
    chmod -R +t /*

  13. #13
    Registrierter Benutzer
    Registriert seit
    20.11.2004
    Beiträge
    13

    Talking Funktioniert

    Hallo User,


    vielen Dank, mein Problem ist gelöst!!


    Habe mich für diese Lösung entschieden:
    SELECT *
    FROM tbl_hyperlinks h
    WHERE NOT EXISTS (SELECT p.id_masterlink
    FROM tbl_permissions p
    WHERE p.id_masterlink = h.id);
    nur noch "AND p.ID_user = " & rs_user("ID")" in das 2. SELECT-Statement eingefügt und fertig ist es.

    Gruß,
    imm0rt4l

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •