2016-10-28 2 views
1

У меня есть две таблицы, одна со списком клиентов, а другая со списком контрактов. Каждый клиент может иметь несколько контрактов. Я хочу получить все Nos, Names, и если у них есть контракт или нет. Это моя просьба:Получить только первый результат external join SQL Server

SELECT c.[no_], 
     c.[name], 
     s.[contract no_] 
FROM [contact] AS c 
     LEFT OUTER JOIN [service contract header] AS s 
        ON c.[no_] LIKE s.[contact no_] 
         AND s.[serv_ contract acc_ gr_ code] LIKE 'SAV' 
ORDER BY s.[contract no_] 

В результате я получаю список всех клиентов, с их контрактами, когда они есть, но если клиент имеет 2 контракта, оказывается в два раза в результате. Однажды с контрактом 1 и с контрактом 2. Я хотел бы иметь только одно появление каждого клиента. Зная, имеет ли он контракт 1 или 2, не имеет значения, я просто хочу знать, есть ли у него контракт или нет. Все, что-то застряло прямо сейчас:/И не может понять, что искать в Интернете, чтобы найти ответ

ответ

2

Вы можете использовать GROUP BY для возврата агрегата, например, COUNT, например, может предоставить вам количество контрактов.

SELECT c.[No_], c.[Name], COUNT(s.[Contact No_]) AS Contracts 
FROM [Contact] AS c 
LEFT JOIN [Service Contract Header] AS s ON c.[No_] LIKE s.[Contact No_] AND s.[Serv_ Contract Acc_ Gr_ Code] LIKE 'SAV' 
GROUP BY c.[No_], c.[Name] 

Вы можете также поместить фильтр на GROUP BY, он известен как HAVING. Это вернет всех клиентов по крайней мере по одному контракту.

SELECT c.[No_], c.[Name] 
FROM [Contact] AS c 
LEFT JOIN [Service Contract Header] AS s ON c.[No_] LIKE s.[Contact No_] AND s.[Serv_ Contract Acc_ Gr_ Code] LIKE 'SAV' 
GROUP BY c.[No_], c.[Name] 
HAVING COUNT(s.[Contact No_]) >= 1 
+0

Спасибо! Это сработало, я получаю сообщение об ошибке с COUNT (s. *), Но все в порядке, я использовал COUNT (s. [Serv_ Contract Acc_ Gr_ Code]), и он отлично работает :) – MaximeBTD

0

Другой способ ОТНОСИТЬСЯ пункт:

SELECT c.[No_], c.[Name], a.cnt as ContactsCount 
    FROM [Contact] AS c 
    OUTER APPLY (SELECT count(*) cnt FROM [Service Contract Header] s WHERE c.[No_] = s.[Contact No_] AND s.[Serv_ Contract Acc_ Gr_ Code] = 'SAV') a 
    ORDER BY c.[No_] 
Смежные вопросы