2012-11-29 19 views
6

Ich möchte Daten erhalten, wenn orgid = 2 oder wenn es überhaupt keine Zeile für die uid. orgid ist ein integer. Das nächste, woran ich denken könnte ist, IS NULL zu tun, aber ich bekomme keine Daten für die uid, die keine orgid Zeile hat. Irgendeine Idee?Abfrage, wo Fremdschlüssel Spalte kann NULL sein

select u.uid,u.fname,u.lname from u 
inner join u_org on u.uid = u_org.uid 
inner join login on u.uid = login.uid 
where u_org.orgid=2 or u_org.orgid is NULL 
and login.access != 4; 

Grundsätzlich ist die OR ist, wenn u_org.orgid Zeile nicht existiert.

+1

Meine Vermutung ... Sie fehlen Klammern? Versuchen Sie stattdessen: '(u_org.orgid = 2 ODER u_org.orgid IST NULL) UND login.access! = 4' – Wolph

+0

Sie könnten es auch so lösen:' COALESCE (u_org.orgid, 2) = 2' – Wolph

+0

@WoLpH - beide haben es nicht gelöst. Vielleicht ist 'IS NULL' das Falsche? Ist es NULL, wenn die Zeile nicht in der Datenbank existiert? – user983223

Antwort

6

Wenn es "keine Zeile überhaupt für die UID" gibt, und Sie JOIN wie Sie, erhalten Sie keine Zeile als Ergebnis. Verwenden Sie LEFT [OUTER] JOIN statt:

SELECT u.uid, u.fname, u.lname 
FROM u 
LEFT JOIN u_org o ON u.uid = o.uid 
LEFT JOIN login l ON u.uid = l.uid 
WHERE (o.orgid = 2 OR o.orgid IS NULL) 
AND l.access IS DISTINCT FROM 4; 

Außerdem müssen Sie die Klammer ich wegen operator precedence hinzugefügt. (AND bindet vor OR).

Ich verwende IS DISTINCT FROM anstelle von != in der letzten WHERE-Bedingung, weil wieder login.accessNULL sein könnte, die nicht qualifizieren würde.

Da jedoch nur u in Spalten aus der Tabelle zu interessieren scheinen zu beginnen, diese alternative Abfrage wäre eleganter:

SELECT u.uid, u.fname, u.lname 
FROM u 
WHERE (u.uid IS NULL OR EXISTS (
    SELECT 1 
    FROM u_org o 
    WHERE o.uid = u.uid 
    AND o.orgid = 2 
    )) 
AND NOT EXISTS (
    SELECT 1 
    FROM login l 
    WHERE l.uid = u.uid 
    AND l.access = 4 
    ); 

Diese Alternative hat den zusätzlichen Vorteil, dass Sie immer bekommen eine Zeile von u, auch wenn es mehrere Zeilen in u_org oder login gibt.

+0

@Erwin_Brandstetter - danke. – user983223

Verwandte Themen