2016-10-07 164 views
0

問題:MainID、JobID、EmployeeIDのテーブルがあります(悪い名前を選択しましたが、現在は変更できません)。SQLサーバー - 優先順位の設定

MainID | EmployeeID | JobID 
100 | 100  | 100 
100 | 100  | 101 
NULL | 100  | 102 

は今、私はメインの契約(1)を持っているもののレコードを示して余分な列を追加したいとこれは(2)

例があるしていない記録されます。

  • IF MainID == JobID - > Main contract
  • IF MainID <> JobID AND MainID IS NULL - >メインコントラクトではありません。
  • IF MainID IS NULL - >メインコントラクト最初の2つの症例の後にはまだtは見出されない。

私が試したSQL文をした

SELECT MainID , EmployeeID, JobID, 
CASE 
WHEN JobID = MainID THEN 1 
WHEN JobID != MainID THEN 2 
WHEN MainID IS NULL AND not exists(SELECT JobID,MainID 
      FROM TableA 
      WHERE JobID = MainID 
      ) THEN 1 
ELSE 2 

END AS MainContract 
FROM  TableA 
ORDER BY SnapshotDate, EmployeeID 

これは最初の2例に適していますが、MainIDがnullの場合、それは(メインない契約を意味する)2上のすべてのレコードを設定します。

提案やその他のアイデアはありますか?

+0

私が意味する、後者の場合は、ちょうど 'MainIDは右、NULL'ですか? – Lamak

+0

正しい。それはちょうどその方法で文書化されました:) – DenStudent

+1

'CASE'は書かれているのと同じ順序で評価されるので、あまり具体的でない前にもっと具体的な条件を' nullとnot exist'にしたいかもしれません。 – Gasper

答えて

0

迅速シャッフル:

select 
case 
    when JobID = MainID then 1 
    when not exists 
     (
     select 1 
     from TableA T1 
     where T1.JobID=T1.MainID 
     and T1.JobID = T2.JobID 
     ) then 1 
    else 2 
end as MainContact 
from TableA T2