2017-03-01 8 views
-2

は、私は2つのテーブルを持っています。
どちらのテーブルにもステータスカラムがあります。SQL選択行

  • すべてのアドレス行のステータス列が「キャンセル」されている場合、Personエントリのステータス値は「キャンセル」されます。
  • Addressテーブルのすべての行が「完了」の場合、Personのステータス値は「完了」になります。
  • 住所表の行のいずれかがキャンセルされ、 の残りが「完了」の場合、人物ステータスは「完了」になります。
  • アドレスの行の1つは、まだ「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はそれをより良くするために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' 
) 

これは、アドレステーブルに少なくとも1つのレコードを持っている状態'inprogress'と人員を返しますが、状況'inprogress'

とアドレスを持っていません
0

私はアドレステーブルの人は ためのすべての行を、「INPROGRESS」のステータスを持っているが、その を持っていないPersonテーブル内のすべてのPERSONIDを選択したいです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 

カウント機能のdoesnカウント結果が== 0の場合、現在のPersonIDのstatus = 'inprogress'はありません