2017-03-01 84 views
-2

我有兩個表: 1 - 人,2 - 地址SQL選擇行

每個人都可以有多個地址條目。
這兩個表都有一個狀態列。

  • 如果所有地址行狀態列都'取消',Person條目的狀態值將被'取消'。
  • 如果Address表中的所有行都是'完成'的,那麼Person的狀態值將被'完成'。
  • 如果其中一個地址錶行被取消,而其餘的地址被「完成」,則個人狀態將被「完成」。
  • 如果地址行的一個仍然「INPROGRESS」,然後資格將 「INPROGRESS」

我想在Person表中選擇所有PERSONID,所有行的那個人的地址表沒有'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

我通常會說子查詢的GROUP BY可以被刪除。也許SQL Server希望它或SELECT DISTINCT更好地執行? – jarlh

+0

添加一些示例表格數據和預期結果 - 以及格式化文本。 – jarlh

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

地址
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) 
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,那麼當前PersonID沒有狀態='inprogress'