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')
我在哪里感到困惑,我是否必须进行选择,或者我是否需要不同类型的加入?
答案 0 :(得分:0)
使用exists
和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')
);
注意:我保持逻辑与您的问题相同,但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