SQL Join 3表返回一个表中不匹配记录的位置

时间:2016-07-15 00:08:17

标签: sql sql-server

SQL Server:尝试加入3个表(一个表是重复的),人员和约会。我想要退回所有他们已经预约A型的人,但没有预约B或C型。

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')

我在哪里感到困惑,我是否必须进行选择,或者我是否需要不同类型的加入?

3 个答案:

答案 0 :(得分:0)

使用existsnot 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')
                 );

注意:我保持逻辑与您的问题相同,但SQL Server无法识别true

答案 1 :(得分: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')

您没有明确说明要求。但你正在看这样的事情。

答案 2 :(得分:0)

这是另一种方式

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