Eddie: Zweiseitige Abfrage nach nicht existierenden Schlüsseln

Hallo allerseits,

ich beisse mir hier gerade die Zaehne an einer etwas komplizierten Abfrage aus :-(

Und zwar habe ich 2 Tabellen REL1 und REL2, die ggf. mittels Fremdschlüssel auf eine dritte Tabelle TARGET verweisen.

Jetzt würde ich gerne diejenigen Einträge in TARGET rausfinden, auf die weder REL1 noch REL2 verweisen, für die dann also jeweils COUNT(*) = 0 wäre. Nur hab ich echt keine Ahnung, wie ich das machen soll :-(

Mit nur einer Fremdschlüssel-Tabelle krieg ich das noch hin:

SELECT *
FROM target
LEFT OUTER JOIN rel1
ON target.id = rel1.targetId
WHERE rel1.targetId IS NULL

Geht das auch irgendwie mit zwei Tabellen???

Danke für eure Hilfe,
Eddie

--
Old men and far travelers may lie with authority.
  1. Hi,

    also zunächst verweise ich dich mal auf einen Join-Artikel in der Beta-Version, da kannst du dir mal anschauen was es so gibt. Für deinen Fall ebenfalls interessant ist dieser Artikel, in dem es um Mehrfachjoins geht.
    Ansonsten: Was für eine Datenbank benutzt du bzw. muss das wirklich so kompliziert sein?
    SELECT *
    FROM target
    WHERE target.id IS NOT IN (SELECT targetid FROM rel1)
      AND target.id IS NOT IN (SELECT targetid FROM rel2)

    Oder auch
    SELECT *
    FROM target t
    WHERE NOT EXISTS (SELECT targetid FROM rel1 WHERE targetid = t.id)
      AND NOT EXISTS (SELECT targetid FROM rel2 WHERE targetid = t.id)

    Und was zum probieren (da hab ich allerdings keine Ahnung, ob was sinnvolles raus kommt)
    SELECT id FROM target
    EXCEPT
    (
    SELECT targetid FROM rel1
    UNION
    SELECT targetid FROM rel2
    )

    Anmk.: SELECT * solltest du dir abgewöhnen: PHP-FAQ

    MfG
    Rouven

    --
    -------------------
    ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
  2. yo,

    ich beisse mir hier gerade die Zaehne an einer etwas komplizierten Abfrage aus :-(

    da gibt es doch diese berühmten tabs für die dritten....

    Jetzt würde ich gerne diejenigen Einträge in TARGET rausfinden, auf die weder REL1 noch REL2 verweisen, für die dann also jeweils COUNT(*) = 0 wäre. Nur hab ich echt keine Ahnung, wie ich das machen soll :-(

    das geht zum beispiel über mengenoperatoren, in deinem falle sollte INTERSECT zum einsatz kommen, sprich zwei OUTER JOINS mit einer IS NULL bedingung wird die schnittmenge gebildet. dabei ist zu beachten, dass die spaltenanzahl gleich sein muss und auch nur attribute der target tabelle.

    die entscheidene frage ist aber, welches dbms unter welcher version du benutzt ???

    Ilja

  3. Hallo ihr beiden,

    danke euch, hat mir sehr geholfen!

    Eddie

    --
    Old men and far travelers may lie with authority.