SQL选择行

时间:2017-03-01 08:13:12

标签: sql sql-server

我有两张桌子: 1 - 人,2 - 地址

每个人都可以拥有多个地址条目 两个表都有一个状态列。

  • 如果所有地址行状态列都被取消',则人员条目的状态值将被取消'。
  • 如果地址表中的所有行都已完成',那么Person的状态值将会完成'。
  • 如果其中一个地址表行被取消,那么 休息完成后,人员状态将完成'。
  • 如果其中一个地址行仍然是“进行中”,那么“人员”状态将为 ' INPROGRESS'

我想在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。

3 个答案:

答案 0 :(得分:1)

一种方法是使用EXISTSNOT 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