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

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

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

  1. SELECT Player
  2. , SchoolName
  3. , School
  4. , Nickname
  5. FROM schools
  6. , players
  7. WHERE players.SchoolName = schools.School
  8. OR players.SchoolName = schools.Nickname
  9. OR schools.School LIKE CONCAT('%', lower(trim(SchoolName)), '%')
  10. AND lower(substring_index(trim(SchoolName), ' ', 1)) = lower(substring_index(trim(School), ' ', 1))
  11. ));

这就是我将这个查询转换成update语句的想法,但我不知道如何正确地执行它,也不知道连接什么,因为没有与每一行匹配的清晰列。

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

1mrurvl11#

这就是你想要的吗?

  1. UPDATE players p JOIN
  2. school s
  3. ON p.SchoolName = s.Nickname OR
  4. (s.School LIKE CONCAT('%', lower(trim(p.SchoolName)), '%') AND
  5. lower(substring_index(trim(p.SchoolName), ' ', 1)) = lower(substring_index(trim(s.School), ' ', 1)))
  6. );
  7. SET p.SchoolName = s.School
  8. WHERE
3ks5zfa0

3ks5zfa02#

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

  1. UPDATE players p
  2. LEFT JOIN schools s1 ON p.SchoolName = s1.School
  3. LEFT JOIN schools s2 ON p.SchoolName = s2.Nickname
  4. SET players.SchoolName = COALESCE(s1.School, s2.School)
  5. players.SchoolNickname = COALESCE(s1.Nickname, s2.Nickname)

简而言之,如果不确定是哪个字段,可以使用不同的联接两次联接到同一个表。然后可以使用coalesce来找出有效的连接。

相关问题