UPDATE INNER JOIN с COALESCE, возвращающим результаты, отличные от аналогичного запроса SELECT - PullRequest
0 голосов
/ 16 марта 2020

Я вижу поведение, которое не могу объяснить при использовании COALESCE в предложении INNER JOIN в инструкции UPDATE. Аналогичный оператор SELECT работает.

MySQL v5.7.27. (Мне нужно остаться на 5.7.x для совместимости AWS Aurora MySQL.)

Схема и данные:

CREATE TABLE S1( id bigint not null, 
displayName varchar(255) not null collate utf8_general_ci );

CREATE TABLE PI( S1_id bigint null, 
col1 varchar(255) null collate utf8_general_ci, 
col2 varchar(255) null collate utf8_general_ci);

INSERT INTO S1 (id, displayName)
VALUES( 1, 'test');

INSERT INTO PI (S1_id, col1, col2)
VALUES( null, null, 'test' );

Рабочий запрос выбора:

select S1.id, S1.displayName, COALESCE( PI.col1, PI.col2)
FROM PI 
  INNER JOIN S1 
  ON S1.displayName = COALESCE(PI.col1, PI.col2) collate utf8_unicode_ci;

возвращает 1 строку:

id displayName COALESCE( PI.col1, PI.col2)
1  test        test

Я ожидаю, что этот оператор обновления обновит 1 строку:

UPDATE PI
INNER JOIN S1 
  ON COALESCE( PI.col1, PI.col2 ) collate utf8_unicode_ci = S1.displayName
SET PI.S1_id = S1.id;

Expected: 1 row updated in PI, S1_id = 1
Actual: 0 rows updated

Для ухмылок я также удалил COLLATE, поскольку это технически не требуется:

UPDATE PI
INNER JOIN S1 ON COALESCE( PI.col1, PI.col2 ) = S1.displayName
SET PI.S1_id = S1.id;

Expected: 1 row updated in PI, S1_id = 1
Actual: 0 rows updated

и также поменял предложение ON:

UPDATE PI
INNER JOIN S1 ON S1.displayName = COALESCE( PI.col1, PI.col2 )
SET PI.S1_id = S1.id;

Expected: 1 row updated in PI, S1_id = 1
Actual: 0 rows updated

Я могу обойти это, добавив столбец в PI и предварительно вычислив значение COALESCE, но я чрезвычайно Любопытно, что происходит!

Заранее спасибо!

1 Ответ

0 голосов
/ 16 марта 2020

в этом запросе кажется, что соединение не выполнено против s1.displayName

UPDATE PI
INNER JOIN S1 
  ON COALESCE( PI.col1, PI.col2 ) collate utf8_unicode_ci = S1.displayName
SET PI.S1_id = S1.id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...