2016-07-15 2 views
0

SQL Server: versuchen, 3 Tabellen (eine Tabelle ist doppelt), Personen und Termine zu verbinden. Ich möchte alle Menschen zurückzukehren, wo sie Verabredung vom Typ A haben, haben aber keinen Termin vom Typ B oder C.SQL Join 3 Tabellen geben zurück, wo Datensatz nicht in einer Tabelle übereinstimmt

SELECT DISTINCT p.first, p.last 
FROM people p 
JOIN appt a ON a.pkid = p.pkid 
JOIN appt s ON s.pkid = p.pkid 
WHERE 
    a.kept = 'SomeValue' 
    AND a.appt_type = '9999999' 
    AND (s.appt_type <> '88888888' OR s.appt_type <> '8888888888') 

hatte Wo bin ich verwirrt, mache ich eine wählen zu tun haben, in oder tun Ich brauche eine andere Art von Join?

+0

ist, ich sehe keine A/B/C-Typen APPT aber meinten Sie ' – dbmitch

+0

@dbmitch s.event_id' ja zu verwenden ... Danke für den Hinweis auf , habe ich die ursprüngliche Frage korrigiert. – DDulla

+0

Wenn Sie möchten, dass alle Bedingungen wahr sind - Ändern Sie die 'OR' in' AND' (und Sie brauchen die Klammern nicht, aber sie werden Ihnen nicht weh tun) – dbmitch

Antwort

0

Verwenden exists und not exists:

select p.* 
from people p 
where exists (select 1 
       from appt a 
       where a.pkid = p.pkid and a.kept = true and 
        a.appt_type = '9999999' 
      ) and 
     not exists (select 1 
        from appt s 
        where s.pkid = p.pkid and 
         s.appt_type in ('88888888', '8888888888') 
       ); 

Hinweis: Ich habe die Logik hielt die gleiche wie in Ihrer Frage, aber SQL Server nicht true erkennen.

+0

Wenn ich exists und nicht exists kann ich nicht aus der auswählen Termintabellen, (zB: a.appt_type wählen); Muss ich einen Join machen um ihn auswählen zu können? – DDulla

+0

@DDulla. . . Ihre 'select'-Klausel hat keine Spalten von' appt'. –

0
SELECT DISTINCT p.first, p.last 
FROM people p 
JOIN appt a ON a.pkid = p.pkid 
WHERE a.kept = true 
AND a.appt_type='9999999' 
AND 
not exists (select 1 from appt s 
       where s.pkid = p.pkid 
       AND (s.appt_type = '88888888' OR 
       s.event_id = '8888888888') 

Sie haben die Anforderung nicht eindeutig angegeben. Aber du siehst so etwas aus.

0

hier eine andere Art und Weise

SELECT DISTINCT p.first, p.last 
FROM people p 
JOIN appt a ON a.pkid = p.pkid 
left JOIN appt s ON s.pkid = p.pkid and (s.appt_type = '88888888' OR s.event_id = '8888888888') 
WHERE 
a.kept = true AND a.appt_type='9999999' AND 
s.event_id is null