Mysql JOIN für fehlende Datensätze

Sprint

Erfahrenes Mitglied
Hallo zusammen,

ich bin mal wieder am Verzweifeln mit den JOINs.

Es gibt drei Tabellen pruefung p, kunden k und nachprf n. In Datensätze in der n sind immer mit Einträgen in der p verbunden. Es müssen keine Datensätze in der n vorhanden sein, die zu einer in p passen, es können aber auch mehrere sein. Ich suche jetzt alle Datensätze aus p, zu denen es keine Einträge in der n gibt, oder keine Einträge in denen das Feld bub gesetzt ist.

Beispiel:
pruefung
Code:
pid
1
2
3

nachprf
Code:
pruefnr    bub
1          0
3          0
3          1

Als Ausgabe wird also 1 und 2 erwartet.

Diese Abfrage gibt mir aber auch die 3 aus, weil es einen Eintrag mit bub = 0 gibt.

SQL:
select distinct p.pid, k.firmenname 
from kunden k, pruefung p
left outer join nachprf n
    on n.pruefnr = p.pid
where substr(p.pid,1,5) = '65300' 
and p.kdnr = k.kdnr 
and p.basispruefung = 0 
and p.status > 99 
and (n.bub is null or n.bub = 0)
order by p.pid

Was mach ich falsch?
 
Lösung
Du kannst es Zweistuffig machen.
Als erste herausfinden, welche pid dass bub !=1 haben und dann alle pruefungen suche, die nicht darin enthalten sind

SQL:
select distinct p.pid, k.firmenname 
from kunden k, pruefung p
where 
    p.kdnr = k.kdnr 
    and p.pid not in (
        select p1.pid
        from pruefung p1, nachprf n    
        where 
            p1.pid = n.pruefnr 
            and n.bub != 0
            substr(p1.pid,1,5) = '65300' 
            and p1.basispruefung = 0 
            and p1.status > 99 
    )
Du kannst es Zweistuffig machen.
Als erste herausfinden, welche pid dass bub !=1 haben und dann alle pruefungen suche, die nicht darin enthalten sind

SQL:
select distinct p.pid, k.firmenname 
from kunden k, pruefung p
where 
    p.kdnr = k.kdnr 
    and p.pid not in (
        select p1.pid
        from pruefung p1, nachprf n    
        where 
            p1.pid = n.pruefnr 
            and n.bub != 0
            substr(p1.pid,1,5) = '65300' 
            and p1.basispruefung = 0 
            and p1.status > 99 
    )
 
Lösung
Zurück