Как обновить таблицу sql значениями из другой таблицы, когда нет чистого столбца для присоединения? - PullRequest
0 голосов
/ 28 мая 2020

У меня две таблицы; Один с информацией об игроках, который содержит столбец SchoolName. Другой с информацией о школах содержит столбцы Школа (официальное название школы) и Псевдоним (названия школы).

Я хочу обновить таблицу игроков таким образом, чтобы для каждого игрока был столбец SchoolName, в котором используется официальное название школы из таблицы школ, и столбец псевдонима, в котором используется псевдоним из школы.

Проблема в том, что таблица игроков содержит школы, которые иногда совпадают со школами. Школа, иногда со школами. Имя, иногда ни одно из-за различий в написании / формулировке.

Например, для для игроков, SchoolName - «Millersville», что соответствует строке в школах, где официальное имя и прозвище «Millersville University of Pennsylvania» и «Marauders».

Для другого ряда в игроках SchoolName - «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;

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Я не тестировал это полностью, но должно быть что-то похожее на это.

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, чтобы выяснить, какое соединение сработало.

0 голосов
/ 28 мая 2020

Это то, что вы хотите?

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  
...