2015-03-04 2 views
0

Теперь я действительно пытался найти что-нибудь в Google с 3 часов. У меня есть две таблицы SQL, которые я хочу объединить друг с другом.Соедините две таблицы SQL, но не размножайте строки

Table_LN представляет собой таблицу, пользователь которой countains атрибут уникальный EMail

Table_AD представляет собой таблицу с атрибутом активного каталога адресов электронной почты и пользователя Принцип Name (Моя проблема, адрес электронной почты, не равна UPN, а также не уникальный)

Моя цель состоит в том, чтобы развернуть ряды в Table_LN с помощью UPN от Table_AD. Если в Table_AD с одним и тем же адресом EMail есть более одной строки, он должен взять первый, который будет найден. Также мне нужен фильтр для стран.

Что я судимый является следующим кодом:

SELECT 
    [FirstName], 
    [LastName], 
    [EMailAddress], 
    [UPN], 
    [OfficeCountry] 
FROM [Table_LN] 
RIGHT JOIN [Table_AD] ON [Table_LN].[EMailAddress] = [Table_AD].[EMail] 
WHERE 
    OfficeCountry = 'Malaysia' 

Моей проблемы теперь, что даного создает мне больше строк, для каждого дополнительного адреса электронной почты. Это означает, что он мулитирует моих пользователей в каталоге.

Может ли кто-нибудь помочь мне или кто-нибудь знает тему, где кто-то просит об этом?

Спасибо

+0

Удалить «ПРАВО» перед тем, как присоединиться к нам? – Rubik

+0

Какой ключ-кандидат используется для выбора строк во внешней таблице? во Внутреннем столе? Если вы не выполняете матч от 1 до 0 или-1, вы всегда будете увеличивать размер набора строк. –

+0

Какой результат вы хотели бы иметь? Вернуть только одно конкретное письмо, объединить их в один столбец? –

ответ

0

Вам нужно будет получить меньшую таблицу, чтобы присоединиться к. Мне нравится использовать CTE. Подзапрос, временная таблица и т. Д. Тоже будут работать.

;WITH cte AS (
    SELECT [UPN], 
     [Email], 
     [RNum] = ROW_NUMBER() OVER(PARTITION BY [Email] ORDER BY [<PK Field>]) 
    FROM [Table_AD] 
) 
SELECT 
    [FirstName], 
    [LastName], 
    [EMailAddress], 
    [UPN], 
    [OfficeCountry] 
FROM [Table_LN] 
LEFT JOIN [cte] 
    ON [cte].[EMail] = [Table_LN].[EMailAddress] 
    AND [cte].[RNum] = 1 
WHERE 
    OfficeCountry = 'Malaysia' 

Сценарий ORDER BY в функции ROW_NUMBER для изменения первой строки. Первичный ключ вашей таблицы, скорее всего, даст вам первую запись в таблице.

+0

Thats nice! Он работает именно так, как я хочу! Большое спасибо! Теперь я могу вернуться домой! ;) – FlaEdLi