我有两张桌子: 1 - 人,2 - 地址
每个人都可以拥有多个地址条目 两个表都有一个状态列。
我想在Person表中选择所有personID,其中Address表中该人的所有行都没有' inprogress'状态,但有他们的Person.Status =' inprogress'
我试图通过做ff来做到这一点。
select personID
from Person P
where P.status not in ('completed','canceled') and
P.personID in (
select A.personID
from Address A
where A.status in ('completed','canceled')
and A.personID = P.personID
group by personID
)
我只是不确定它是否正确,因为我可能会选择已取消并已完成但仍可能正在进行地址行的personID。
答案 0 :(得分:1)
一种方法是使用EXISTS
和NOT EXISTS
:
SELECT personID
FROM Person p
WHERE p.status = 'inprogress'
AND EXISTS (
SELECT 1
FROM Address a
WHERE a.personId = p.personId
)
AND NOT EXISTS (
SELECT 1
FROM Address a
WHERE a.personId = p.personId
AND a.status = 'inprogress'
)
这将返回状态为'inprogress'
的所有人,这些人在地址表中至少有一条记录,但没有状态为'inprogress'
的地址
答案 1 :(得分:0)
我想在Person表中选择所有行的所有personID 地址表中的那个人没有'inprogress'状态, 但是他们的Person.Status ='inprogress'
根据您的上述关键要求,我希望这应该没问题......
select personID from Person
where status = 'inprogress'and personID in
(select personID from Address
where status in ('completed','canceled') group by personID)
答案 2 :(得分:0)
试试这个:
select Person.PersonID
from Person
join address on Person.PersonID = address.personID and Person.status='inprogress'
group by Person.PersonID
having count(case when address.status='inprogress' then 1 else null end)=0
计数函数不计算空值,因此如果计数结果== 0则没有状态=' inprogress'对于当前的PersonID