如何使用嵌套查询更新行

时间:2019-04-03 08:34:16

标签: mysql sql-update nested-query

我有一个表格,其中出生日期是0000-00-00,格式为YYYY-MM-DD。我已经完成了将这些日期更新为真实DOB的任务。

只能从看起来像950313094353(不是真实的IC编号)的标识号中提取DOB,并且像YYMMDDSNRAND那样创建IC,其中SN是状态号,例如09和RAND只是4个随机数,例如4353。

从IC号码中,我可以通过将前6位数字作为子字符串来获取出生日期。

表格

student_st
IC_NO         D_BIRTH     COUNTRY
------------  ----------  --------
940525053455  0000-00-00  MALAYSIA

IC_NO的数据类型为varchar,D_BIRTH为日期,COUNTRY为varchar

我尝试过的代码是

UPDATE `student_st`
SET `D_BIRTH` =  CONCAT('19', (SELECT SUBSTR(`IC_NO`, 1, 2) FROM `student_st` WHERE `COUNTRY`='MALAYSIA'),
                 '-', (SELECT SUBSTR(`IC_NO`, 3, 2) FROM `student_st` WHERE `COUNTRY`='MALAYSIA'),
                 '-', (SELECT SUBSTR(`IC_NO`, 5, 2) FROM `student_st` WHERE `COUNTRY`='MALAYSIA')) 
WHERE `COUNTRY`='MALAYSIA' AND DATE(`D_BIRTH`)='0000-00-00'

这是我得到的错误

Error in query (1292): Truncated incorrect date value: '0000-00-00'

我不知道为什么错误说明了这一点。

从我的代码中,我期望得到的结果是19YY-MM-DD,其中YY,MM和DD是从子串的IC号获得的。

1 个答案:

答案 0 :(得分:0)

您不需要子查询中的所有选择,更新就是逐行更新。

drop table if exists t;
create table t
(IC_NO  varchar(20),       D_BIRTH  date, country varchar(20));
insert into t values
(940525053455 , '0000-00-00','malasia'),
(960525053455 , '1995-05-25','malasia'),
(940525053455 , '0000-00-00','aa');

update t
        set d_birth = str_to_date(concat('19',SUBSTR(`IC_NO`, 1, 2),SUBSTR(`IC_NO`, 3, 2) ,SUBSTR(`IC_NO`, 5, 2)),'%Y%m%d')
where country = 'malasia' and d_birth = '0000-00-00'
;

select * from t;

+--------------+------------+---------+
| IC_NO        | D_BIRTH    | country |
+--------------+------------+---------+
| 940525053455 | 1994-05-25 | malasia |
| 960525053455 | 1995-05-25 | malasia |
| 940525053455 | 0000-00-00 | aa      |
+--------------+------------+---------+
3 rows in set (0.00 sec)