我看到在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值来解决此问题,但是我很好奇发生了什么!
谢谢!
答案 0 :(得分:0)
在此查询中,似乎未针对s1.displayName进行连接
sf