当没有明确的列可连接时,如何用另一个表中的值更新sql表?

5lhxktic  于 2021-08-13  发布在  Java
关注(0)|答案(2)|浏览(431)

我有两张table;包含玩家信息的一个,其中包含一个schoolname列。另一个包含学校信息的列包含学校(官方学校名称)和昵称(学校名称)。
我想更新players表,以便每个player都有一个schoolname列,它使用schools表中的官方学校名称,还有一个昵称列,它使用schools表中的昵称。
问题是players表包含的学校有时与schools.school匹配,有时与schools.nickname匹配,有时与两者都匹配,因为拼写/措辞不同。
例如,对于玩家中的玩家,学校名称为“millersville”,这与学校中的行相匹配,学校的官方名称和昵称为“millersville university of pennsylvania”和“Maraders”。
对于不同的一排玩家,学校名称是“亚利桑那”,它可以匹配“亚利桑那州立大学”,昵称“亚利桑那州立大学”或“亚利桑那大学”,昵称“亚利桑那州”。
我提出了这个查询,它最准确地匹配了两个表中的学校名称,但现在我不知道如何用正确的学校名称更新players表。

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语句的想法,但我不知道如何正确地执行它,也不知道连接什么,因为没有与每一行匹配的清晰列。

UPDATE players 
INNER JOIN schools ON (SELECT ....)
SET SchoolName = schools.School
SchoolNickname = schools.Nickname;
1mrurvl1

1mrurvl11#

这就是你想要的吗?

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
3ks5zfa0

3ks5zfa02#

我还没有完全测试过,但应该是类似的。

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来找出有效的连接。

相关问题