UPDATE INNER JOIN与COALESCE返回的结果与类似的SELECT查询不同

时间:2020-03-16 07:49:47

标签: mysql

我看到在UPDATE语句的INNER JOIN子句中使用COALESCE时无法解释的行为。类似的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 :(得分:0)

在此查询中,似乎未针对s1.displayName进行连接

sf
相关问题