2017-12-01 21 views
1

現在、以下の表Aのデータがあります。TSQL選択されていない項目を検索

Title_1 | Contract A 
Title_1 | Contract B 
Title_1 | Contract C 
Title_2 | Contract A 
Title_2 | Contract D 

私は以下の結果にデータを有効にする

SELECT DISTINCT T2.Title, SUBSTRING(
       SELECT '; ' + Contract as [text()] 
       FROM dbo.TitleContracts T1 
       WHERE T1.Title = T2.Title 
       AND Contract IN (
        SELECT Contract FROM dbo.ValidContracts 
       ) 
       FOR XML PATH ('') 
      ), 2, 1000) [ContractList] 
FROM dbo.TitleContracts T2 

上記のクエリを使用しています。しかし、私がやろうとしているのは、選択されていないValidContractsテーブルを使って各タイトルの契約リストを見つけることです。だから我々は契約のADを持っているならば、タイトル1は契約Dとタイトル2を返す契約B &契約C.を返します

Title_1 | Contract A; Contract B; Contract C 
Title_2 | Contract A; Contract D 

私はこれを考える方法を超えるだろうが、私が試した何もで私を取っているように見えるん正しい方向。私はあなたに私のコードを書くように求めているわけではありませんが、正しい方向への動きは素晴らしいでしょう。

+0

あなたは契約のルックアップテーブルを持っていますか、または契約が欠落していることを知っている唯一の方法は、TableAの中にいくつかの他のタイトルがそれを持っているということですか?あなたは "ValidContracts"テーブルに言及します。そのテーブルには何が入っていますか? –

+1

あなたは 'NOT IN'を意味しますか? –

+0

@TabAllemanテーブルdbo.ValidContractsには、現在アクティブなすべてのコントラクトのリストがあります。 – eknofsky

答えて

1

with c_list as 
(
select 'Contract A' as TheContract 
union all 
select 'Contract B' 
union all 
select 'Contract C' 
union all 
select 'Contract D' 
) 
, MixList as 
(
select distinct T2.Title, C1.TheContract 
from TitleContracts T2 
cross join c_list C1 
) 
select M3.* 
from MixList M3 
left join TitleContracts T3 
on T3.Title = M3.Title 
and M3.TheContract = T3.Contract 
where T3.T3.Title is null 
+1

クロス・ジョインは私が以前考えていたものですが、それが最良のアプローチであるかどうかは分かりませんでした。私は契約のリストのCTEは必要ありませんが、他のすべてはここに完全にあります。本当にありがとうと思います。 – eknofsky

2

[OK]を使用する代わりに、INを使用してValidContractsを右クリックし、右揃えを行い、左側がNULLの行をフィルタします。 CTE使用

関連する問題