当没有明确的列可以加入时,如何使用另一个表中的值更新 sql 表?
Posted
技术标签:
【中文标题】当没有明确的列可以加入时,如何使用另一个表中的值更新 sql 表?【英文标题】:How to update an sql table with values from another table when there is no clear column to join on? 【发布时间】:2020-05-27 21:09:14 【问题描述】:我有两张桌子;包含有关玩家信息的一个,其中包含一个 SchoolName 列。另一个关于学校的信息包含列学校(官方学校名称)和昵称(学校名称)。
我想更新玩家表,以便每个玩家都有一个使用学校表中官方学校名称的 SchoolName 列和一个使用学校昵称的昵称列。
问题是球员表包含的学校有时与学校.学校匹配,有时与学校。昵称匹配,有时由于拼写/措辞不同,两者都不匹配。
例如,对于球员中的球员,SchoolName 为“Millersville”,这将与官方名称和昵称为“Millersville University of Pennsylvania”和“Marauders”的学校中的行相匹配。
对于不同的玩家行,学校名称是“Arizona”,可以匹配“Arizona State University”,昵称“Arizona State”或“University of Arizona”,昵称“Arizona”。
我提出了这个查询,它最准确地匹配了两个表的学校名称,但现在我不确定如何使用正确的学校名称更新玩家表。
SELECT Player
, SchoolName
, School
, Nickname
FROM schools
, players
WHERE players.SchoolName = schools.School
OR players.SchoolName = schools.Nickname
OR schools.School LIKE CONCAT('%', lower(trim(SchoolName)), '%')
AND lower(substring_index(trim(SchoolName), ' ', 1)) = lower(substring_index(trim(School), ' ', 1))
));
这就是我想将此查询转换为更新语句的原因,但我不知道如何正确执行或加入什么,因为没有与每一行匹配的明确列。
UPDATE players
INNER JOIN schools ON (SELECT ....)
SET SchoolName = schools.School
SchoolNickname = schools.Nickname;
【问题讨论】:
为什么选择不使用正确的、明确的、标准的、可读的JOIN
语法?
见meta.***.com/questions/333952/…
【参考方案1】:
这是你想要的吗?
UPDATE players p JOIN
school s
ON p.SchoolName = s.Nickname OR
(s.School LIKE CONCAT('%', lower(trim(p.SchoolName)), '%') AND
lower(substring_index(trim(p.SchoolName), ' ', 1)) = lower(substring_index(trim(s.School), ' ', 1)))
);
SET p.SchoolName = s.School
WHERE
【讨论】:
【参考方案2】:我还没有完全测试过这个,但应该和这个类似。
UPDATE players p
LEFT JOIN schools s1 ON p.SchoolName = s1.School
LEFT JOIN schools s2 ON p.SchoolName = s2.Nickname
SET players.SchoolName = COALESCE(s1.School, s2.School)
players.SchoolNickname = COALESCE(s1.Nickname, s2.Nickname)
简而言之,如果您不确定哪个字段,您可以使用不同的连接两次连接到同一个表。然后,您可以使用 coalesce 找出有效的连接。
【讨论】:
奇怪,是的,但它有效。在其他地方,您将为尝试更新的每一行编写子选择。 如果这是真的,那么大概不使用 LEFT JOIN 的答案是错误的? 在 SQL 中几乎有不止一种方法可以做任何事情。更重要的是什么更有效,什么最适合特定情况。 所以你的论点是你的方法更有效?以上是关于当没有明确的列可以加入时,如何使用另一个表中的值更新 sql 表?的主要内容,如果未能解决你的问题,请参考以下文章