Zweiseitige Abfrage nach nicht existierenden Schlüsseln
Eddie
- datenbank
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
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
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
Hallo ihr beiden,
danke euch, hat mir sehr geholfen!
Eddie