更新一个表的列中的值(如果这些值存在于另一个表的列中并且这些值是唯一的)

问题描述 投票:0回答:1

我有一列填充了需要更新的值,因为它们太模糊了,我想用另一个表列中的值更新这些值。

玩家表:

身份证 电子邮件 名字
1 [电子邮件受保护] 鲍勃
2 [电子邮件受保护] 劳拉
3 [电子邮件受保护] 乔希
4 [电子邮件受保护] 亚历克斯
5 [电子邮件受保护] 鲍勃
6 [电子邮件受保护] 亚历克斯

运动桌:

运动 玩家
高尔夫 劳拉
篮球 乔什
棒球 亚历克斯
足球 鲍勃
排球 劳拉
游泳 亚历克斯
驾驶 鲍勃
拳击 鲍勃

在此示例中,我尝试将 Players 列中的值替换为玩家的 Email,因为某些玩家具有相同的名字。我不相信有办法找出 BobAlexSports Table 中,所以我想做最小值并更改名称的列值没有重复的名字。更新后的运动表应如下所示。

更新运动表:

运动 玩家
高尔夫 [电子邮件受保护]
篮球 [电子邮件受保护]
棒球 亚历克斯
足球 鲍勃
排球 [电子邮件受保护]
游泳 亚历克斯
驾驶 鲍勃
拳击 鲍勃

我的第一个想法是找到 Player 表中没有任何多次出现的 First Names 的所有列值,我设法通过下面的查询达到了这一点。

SELECT Email, FirstName
FROM PlayerTable
GROUP BY Email, FirstName
HAVING COUNT(P.FirstName) = 1

但是,我还没有找到一种方法来使用它来正确更新体育表。我尝试了以下几行代码,但只是输出了不正确的表格。

UPDATE SportsTable
SET Player = (
    SELECT P.Email, P.FirstName
    FROM PlayerTable P
    WHERE P.FirstName = Player
    GROUP BY P.Email, P.FirstName
    HAVING COUNT(P.FirstName) = 1
)
sql sql-server sql-update multiple-tables
1个回答
0
投票

你基本上走在正确的轨道上。 此查询将返回仅与一封电子邮件一起出现的所有名字及其电子邮件:

SELECT 
  FirstName,
  MIN(Email) AS Email
FROM Player
GROUP BY 
  FirstName
HAVING 
  COUNT(DISTINCT Email) = 1;

因此,您可以在更新命令中使用带有此选择的 CTE 并将其加入到 Sports 表中:

WITH uniqueMails AS
(SELECT 
  FirstName,
  MIN(Email) AS Email
FROM Player
GROUP BY 
  FirstName
HAVING 
  COUNT(DISTINCT Email) = 1)
UPDATE s
SET s.Players = u.Email
FROM Sport s
JOIN uniqueMails u
ON s.Players = u.FirstName;

使用您的示例数据验证它在此 db<>fiddle 上是否按预期工作。

© www.soinside.com 2019 - 2024. All rights reserved.