2017-12-01 6 views
1

Ich habe derzeit Daten in der Tabelle A sitzen wie die unten.TSQL Suche nach Elementen nicht ausgewählt

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

Ich bin mit

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 

der obigen Abfrage der Daten in die folgenden Ergebnisse zu verwandeln. Ich versuche jedoch auch, die Liste der Verträge für jeden Titel mithilfe der Tabelle "ValidContracts" zu finden, die nicht ausgewählt wurde. Also, wenn wir Vertrag AD haben, dann würde Title_1 zurückkehren Vertrag D und Title_2 würde Vertrag B & Vertrag C.

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

Ich bin wahrscheinlich weit über das Denken zurückkommen, aber nichts, was ich versucht habe, scheint mir nehmen zu werden in die richtige Richtung. Ich bitte Sie nicht, meinen Code zu schreiben, aber ein Anstupsen in die richtige Richtung wäre erstaunlich.

+0

Haben Sie eine Lookup-Tabelle von Verträgen haben, oder ist der einzige Weg, zu wissen, dass ein Vertrag fehlt, dass einige andere Titel in TableA es hat? Sie erwähnen eine "ValidContracts" -Tabelle. Was enthält diese Tabelle? –

+1

Meinst du "NICHT IN"? –

+0

@TabAlleman Die Tabelle dbo.ValidContracts enthält eine Liste aller derzeit aktiven Verträge. – eknofsky

Antwort

1

Mit einem CTE:

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

Ein Cross-Join war das, was ich vorher in Betracht gezogen hatte, aber ich war mir nicht sicher, ob das der beste Ansatz wäre. Während ich die CTE für die Liste der Verträge nicht brauche, ist alles andere hier perfekt und ich schätze Ihre Eingabe sehr. – eknofsky

2

Ok, anstatt ein IN zu verwenden, um in ValidContracts zu gucken, machen Sie eine RECHTE JOIN, und filtern Sie nach Zeilen, deren linke Seite NULL ist.

Verwandte Themen