您必须将 mytable 封装在 SELECT 中
update myTable
set closedOrNot =
(case when (SELECT CONCAT(ltiNum,ltiCd) FROM (SELECT * FROM myTable) t1 where updateDate Like '2020-08%'
and CONCAT(ltiNum,ltiCd) in (SELECT CONCAT(ltiNum,ltiCd) FROM (SELECT * FROM myTable) t1 WHERE updateDate Like '2020-07%'
)) then 'existing'
when (SELECT CONCAT(ltiNum,ltiCd) FROM (SELECT * FROM myTable) t1 where updateDate Like '2020-08%'
and CONCAT(ltiNum,ltiCd) not in (SELECT CONCAT(ltiNum,ltiCd) FROM (SELECT * FROM myTable) t1 WHERE updateDate Like '2020-07%'
)) then 'New'
when (SELECT CONCAT(ltiNum,ltiCd) FROM (SELECT * FROM myTable) t1 where updateDate Like '2020-07%'
and CONCAT(ltiNum,ltiCd) not in (SELECT CONCAT(ltiNum,ltiCd) FROM (SELECT * FROM myTable) t1 WHERE updateDate Like '2020-08%'
)) then 'Closed'
end);
所以mysql认为,这是另一个表,但你基本上是在改变所有的行,因为你没有使用WHERE子句,所以可能会发生更远的路,结果可能会改变
基本上你告诉你的一切都是正确的,但你的查询还有另一个问题
CREATE TABLE myTable (
`ltiNum` INTEGER,
`ltiCd` VARCHAR(1),
`updateDate` VARCHAR(10),
`closedOrNot` VARCHAR(8)
);
INSERT INTO myTable
(`ltiNum`, `ltiCd`, `updateDate`, `closedOrNot`)
VALUES
('1', 'A', '2020-07-01', 'NULL'),
('2', 'B', '2020-07-01', 'Closed'),
('3', '0', '2020-07-01', 'NULL'),
('4', 'D', '2020-07-01', 'NULL'),
('5', 'E', '2020-07-01', 'NULL'),
('1', 'A', '2020-08-01', 'existing'),
('3', '0', '2020-08-01', 'existing'),
('4', 'D', '2020-08-01', 'existing'),
('5', 'E', '2020-08-01', 'existing'),
('6', 'F', '2020-08-01', 'New');
update myTable
set closedOrNot =
(case when (SELECT CONCAT(ltiNum,ltiCd) FROM (SELECT * FROM myTable) t1 where updateDate Like '2020-08%'
and CONCAT(ltiNum,ltiCd) in (SELECT CONCAT(ltiNum,ltiCd) FROM (SELECT * FROM myTable) t1 WHERE updateDate Like '2020-07%'
)) then 'existing'
when (SELECT CONCAT(ltiNum,ltiCd) FROM (SELECT * FROM myTable) t1 where updateDate Like '2020-08%'
and CONCAT(ltiNum,ltiCd) not in (SELECT CONCAT(ltiNum,ltiCd) FROM (SELECT * FROM myTable) t1 WHERE updateDate Like '2020-07%'
)) then 'New'
when (SELECT CONCAT(ltiNum,ltiCd) FROM (SELECT * FROM myTable) t1 where updateDate Like '2020-07%'
and CONCAT(ltiNum,ltiCd) not in (SELECT CONCAT(ltiNum,ltiCd) FROM (SELECT * FROM myTable) t1 WHERE updateDate Like '2020-08%'
)) then 'Closed'
end);
子查询返回超过 1 行
SELECT CONCAT(ltiNum,ltiCd)
FROM (SELECT * FROM myTable) t1
where updateDate Like '2020-08%'
and CONCAT(ltiNum,ltiCd) in (SELECT CONCAT(ltiNum,ltiCd) FROM (SELECT * FROM myTable) t1 WHERE updateDate Like '2020-07%' )
| CONCAT(ltiNum,ltiCd) |
| :-------------------- |
| 1A |
| 30 |
| 4D |
| 5E |
SELECT CONCAT(ltiNum,ltiCd) FROM (SELECT * FROM myTable) t1 where updateDate Like '2020-08%'
and CONCAT(ltiNum,ltiCd) not in (SELECT CONCAT(ltiNum,ltiCd) FROM (SELECT * FROM myTable) t1 WHERE updateDate Like '2020-07%'
)
| CONCAT(ltiNum,ltiCd) |
| :-------------------- |
| 6F |
SELECT CONCAT(ltiNum,ltiCd) FROM (SELECT * FROM myTable) t1 where updateDate Like '2020-07%'
and CONCAT(ltiNum,ltiCd) not in (SELECT CONCAT(ltiNum,ltiCd) FROM (SELECT * FROM myTable) t1 WHERE updateDate Like '2020-08%'
)
| CONCAT(ltiNum,ltiCd) |
| :-------------------- |
| 2B |
db小提琴here
如您所见,第一个 CASE 返回 4 个结果,因此您的构造不起作用-