我有一列填充了需要更新的值,因为它们太模糊了,我想用另一个表列中的值更新这些值。
玩家表:
身份证 | 电子邮件 | 名字 |
---|---|---|
1 | [电子邮件受保护] | 鲍勃 |
2 | [电子邮件受保护] | 劳拉 |
3 | [电子邮件受保护] | 乔希 |
4 | [电子邮件受保护] | 亚历克斯 |
5 | [电子邮件受保护] | 鲍勃 |
6 | [电子邮件受保护] | 亚历克斯 |
运动桌:
运动 | 玩家 |
---|---|
高尔夫 | 劳拉 |
篮球 | 乔什 |
棒球 | 亚历克斯 |
足球 | 鲍勃 |
排球 | 劳拉 |
游泳 | 亚历克斯 |
驾驶 | 鲍勃 |
拳击 | 鲍勃 |
在此示例中,我尝试将 Players 列中的值替换为玩家的 Email,因为某些玩家具有相同的名字。我不相信有办法找出 Bob 和 Alex 在 Sports 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
)
你基本上走在正确的轨道上。 此查询将返回仅与一封电子邮件一起出现的所有名字及其电子邮件:
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 上是否按预期工作。