加入两个SQL表,但不要乘以行

时间:2015-03-04 17:32:14

标签: sql-server select join

现在我真的试着在3小时后在谷歌找到任何东西。 我想要互相加入两个SQL表。

Table_LN是一个用户表,它计算唯一的电子邮件属性

Table_AD是一个包含Active Directory电子邮件属性和用户主要名称的表(我的问题,电子邮件地址不等于UPN,也不是唯一的)

我的目标是使用Table_LN的UPN扩展Table_AD中的行。如果Table_AD中的多行有一个具有相同电子邮件地址的行,则应该使用它将找到的第一行。我还需要一个国家的过滤器。

我尝试的是以下代码:

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

我现在的问题是,对于每个额外的电子邮件地址,此规则会为我创建更多行。这意味着它会将我的用户多播到目录中。

有人可以帮助我,或者有人知道有人要求的话题吗?

谢谢

1 个答案:

答案 0 :(得分:2)

您需要获得一个较小的表才能加入。我喜欢使用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'

在ROW_NUMBER函数中使用ORDER BY来改变第一行。您的表的主键可能会为您提供表中的第一个条目。