当没有明确的列可以加入时,如何使用另一个表中的值更新 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 表?的主要内容,如果未能解决你的问题,请参考以下文章

涉及因素的数据表分配

使用 codeigniter 将连接表中的列连接到另一列

删除多个表中的列,其列名与另一个表中的值类似

如何将 true 或 false 的值更改为文本值类型 我正在检查整个表中的行 注意该表是数据表类型?

如何根据与另一个表中的值的比较来更新列

我想知道使用 INNER JOIN 和相等运算符更快,或者当我尝试通过另一个表的列过滤表中的数据时使用 IN