2016-07-11 14 views
1
existiert

Lassen Sie uns sagen, ich habe diese Tabelle (dies vereinfacht ist, gibt es natürlich auch andere Spalten):T-SQL eine Zeile zurück, wenn eine andere Zeile nicht

CompanyID (int) 
ContactName (varchar(50)) 
ContactType (char(1)) 

mit den Werten:

CompanyID | ContactName   | ContactType 
----------------------------------------------- 
1   | John Doe    | A 
1   | Jane Smith   | B 
2   | Ralph Jones   | B 
3   | Dick Grayson   | A 

Was ich will, sind alle Unternehmen, bei denen es eine ContactType = 'A' gibt, es sei denn, es gibt keine ContactType = 'A' geben Sie die ContactType = 'B' zurück. So in diesem Beispiel, ich will:

1, John Doe (because he's a ContactType A) 
2, Ralph Jones (because Company #2 doesn't have a ContactType A) 
3, Dick Grayson (because he's a ContactType A) 

Ich kann nicht einfach sagen: „A oder B“, weil ein Unternehmen beide haben kann.

Hier ist, was ich versucht (und scheiterte)

use MyFancyDatabase 
drop table #TypeA 
drop table #TypeB 
drop table #TypeAB 

create table #TypeA(ownerkey int, ContactName varchar(200), ContactType char(1)) 
insert #TypeA 
Select ownerkey, ContactName, ContactType from address 
where ContactType = 'A' and CancelDate is null 

create table #TypeB(ownerkey int, ContactName varchar(200), ContactType char(1)) 
insert #TypeB 
Select ownerkey, ContactName, ContactType from address 
where ContactType = 'B' and CancelDate is null 

create table #TypeAB(ownerkey int, ContactName varchar(200), ContactType char(1)) 
insert #TypeAB 

select * from #TypeA 
except 
select * from #TypeB 

ich auf Englisch denke, es ist „A, aber wenn es keine A ist, dann nehmen B.“

Irgendwelche Vorschläge?

+0

versuchen 'coalesce()', vielleicht. –

Antwort

1
SELECT a.OwnerKey, a.CompanyName, Case WHEN a.ContactType IS NULL THEN b.ContactType ELSE a.ContactType END AS ContactType 
FROM #TypeA a 
LEFT JOIN #TypeB b on a.OwnerKey = b.OwnerKey 
+0

Kurz und süß. Ich habe die Ergebnisse bekommen, die ich gesucht habe, danke. – Duston

1

Ich denke, das sollte für Sie arbeiten.

with SortedResults as 
(
    select CompanyID 
     , ContactName 
     , ContactType 
     , ROW_NUMBER() over (partition by CompanyID order by ContactType) as RowNum 
    from ThisTable 
) 

select * 
from SortedResults 
where RowNum = 1 
0

Versuchen Sie, diese SQL

Select t1.CompanyID , 
     ContactName = IIF(t1.ContactType='A',t1.ContactName,t2.ContactName) 
     ContactType = IIF(t1.ContactType='A','A',t2.ContactType) 
FROM address as t1 left join address as t2 
    on t1.CompanyID = t2.CompanyID 
    AND t1.ContactName = t2.ContactName 
    AND (t1.ContactType <> t2.ContactType) 

WENN Sie mehr Typ als A oder B haben und Sie wollen einfach nur A und B fügen Sie diese auf dem wo statment

WHERE (t1.ContactType = 'A' OR t1.ContactType = 'B') 
    AND (t2.ContactType = 'A' OR t2.ContactType = 'B') 
0

Die Spalten in Ihrer definierten Tabelle scheinen nicht mit denen in Ihrer Beispielabfrage übereinzustimmen. Ich vermute, OwnerKey ist das gleiche wie CompanyID?

Wenn ja, und Sie halten die meisten der Rest des Codes, der letzte wählen würde müssen:

select * from #TypeA 
union all 
select * from #TypeB 
where not exists (
    select * 
    from #TypeA 
    where #TypeA.ownerkey = #TypeB.ownerkey) 
Verwandte Themen