我需要一些帮助来回答一个问题.

我们有两个栏目

Id AccountId
201 a-123
NULL a-123
NULL a-123
202 a-234
203 a-345

如何让ID列根据Account ID列与ID列中相应的空值是否具有相同的值来替换空值?

就像这样:

Id AccountId
201 a-123
201 a-123
201 a-123
202 a-234
203 a-345

我不知道从哪里开始,我已经try 了IF()coalesce(),但都不起作用.

Select ID, 帐户ID, If(ID为空,coalesce(ID,Account ID),ID)

给了我这个

Id AccountId
201 a-123
a-123 a-123
a-123 a-123
202 a-234
203 a-345

任何帮助都是非常感激的.

推荐答案

您可以在CASE语句中编写一个子查询来实现以下目标:

SELECT
  CASE WHEN Id IS NULL THEN 
          (SELECT Id 
           FROM sample_table 
           WHERE AccountId = a.AccountId
           LIMIT 1)
       ELSE Id
  END AS Id,
  AccountId
FROM sample_table a
ORDER BY Id ASC

但是,更干净的解决方案应该是执行CROSS JOIN,并在联接期间删除NULL的记录:

SELECT b.Id,
       a.AccountId
FROM sample_table a
CROSS JOIN sample_table b
  ON a.AccountId = b.AccountId AND b.Id IS NOT NULL
ORDER BY b.Id ASC

如果您需要UPDATE个表,那么将上面的查询包含在一个UPDATE语句中:

UPDATE sample_table a
JOIN (SELECT c.Id,
             b.AccountId
      FROM sample_table b
          CROSS JOIN sample_table c
               ON b.AccountId = c.AccountId AND c.Id IS NOT NULL
      )  AS d ON a.AccountId=d.AccountId  
SET a.id = d.id

Result:

Id AccountId
201 a-123
201 a-123
201 a-123
202 a-234
203 a-345

DB<;&>小提琴here.

Mysql相关问答推荐

如何在逗号分隔字符串值中使用LEFT函数

为什么IN子句中有GROUP BY会导致查询变得不可执行?

如何获得表中只有最大值行的一个列被另一个列分区?

JOOQ-如何在一个查询中引用多个(但不是所有)表中的所有字段

约会时的意外行为

如何使用GROUP BY调优简单SQL查询

为什么MySQL派生条件下推优化不起作用

查询优化并提高性能

使用不同的 where 列进行子 Select

从 MySQL 8.0.12 升级到 8.0.32 时出错

MySql,如何从列中替换某种格式的字符串

是否可以在一个查询中将字符串附加到许多匹配的行

此插页中的X是什么> X'3C2F756C3E'

Laravel classloader.php 错误打开流失败:没有这样的文件或目录

mysql 按日期 Select 总和组

让 MySQL 在 OSX 10.7 Lion 上运行

如何使用 SQL 数据库中的经纬度查找最近的位置?

MySQL 删除多列

警告:mysqli_connect(): (HY000/1045): Access denied for user 'username'@'localhost' (using password: YES)

电话号码和地址的mysql数据类型