【问题标题】:Join two SQL tables but don't multiply rows加入两个 SQL 表但不相乘
【发布时间】:2015-05-05 19:53:15
【问题描述】:

现在我真的尝试在 3 小时后在 Google 中查找任何内容。 我有两个要相互连接的 SQL 表。

Table_LN 是一个包含唯一电子邮件属性的用户表

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

我的目标是使用来自 Table_AD 的 UPN 扩展 Table_LN 中的行。如果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'

我现在的问题是,这个声明为每个额外的电子邮件地址创建了更多行。这意味着它会在目录中增加我的用户数。

你能帮我吗?或者有人知道有人问这个话题吗?

谢谢

【问题讨论】:

  • 在加入之前删除RIGHT ?
  • 使用什么候选键来选择外表中的行?在内表?除非您执行 1 到 0 或 1 匹配,否则您将始终增加行集大小。
  • 您希望得到什么结果?只返回一封特定的电子邮件,将它们连接成一列?

标签: sql-server select join


【解决方案1】:

您需要获得一个较小的表才能加入。我喜欢使用 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 来更改哪一行是第一行。您的表的主键可能会为您提供表中的第一个条目。

【讨论】:

  • 太好了!它完全按照我的意愿工作!非常感谢!现在我可以回家了! ;)
猜你喜欢
  • 2015-11-05
  • 2018-03-22
  • 1970-01-01
  • 2021-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-01
相关资源
最近更新 更多