【问题标题】:sql - update in subquery & same tablesql - 在子查询和同一张表中更新
【发布时间】:2020-09-06 14:07:40
【问题描述】:

我想更新多行数据,但出现错误。

下面是表信息和查询语句。

我的表

ltiNum  ltiCd   updateDate  ClosedOrNot

1   A   2020-07-01  
2   B   2020-07-01  
3   C   2020-07-01  
4   D   2020-07-01  
5   E   2020-07-01  
1   A   2020-08-01  
3   C   2020-08-01  
4   D   2020-08-01  
5   E   2020-08-01  
6   F   2020-08-01  

SQL

update myTable 
set closedOrNot = 
        (case when (SELECT CONCAT(ltiNum,ltiCd) FROM myTable where updateDate Like '2020-08%'
                    and CONCAT(ltiNum,ltiCd) in (SELECT CONCAT(ltiNum,ltiCd) FROM myTable WHERE updateDate Like '2020-07%'       
        )) then 'existing'
        when (SELECT CONCAT(ltiNum,ltiCd) FROM myTable where updateDate Like '2020-08%'
                    and CONCAT(ltiNum,ltiCd) not in (SELECT CONCAT(ltiNum,ltiCd) FROM myTable WHERE updateDate Like '2020-07%'
        )) then 'New'        
         when (SELECT CONCAT(ltiNum,ltiCd) FROM myTable where updateDate Like '2020-07%'
                    and CONCAT(ltiNum,ltiCd) not in (SELECT CONCAT(ltiNum,ltiCd) FROM myTable WHERE updateDate Like '2020-08%'
        )) then 'Closed'
    end);

错误代码:

mysql 错误代码 1093: You can't specify target table for 'myTable' 在 FROM 子句中更新

问题出在哪里?

我想看后续图片

请帮忙~!

【问题讨论】:

  • 我的印象是您需要查看您的案例陈述。似乎没有条件和CONCAT函数无关。换句话说,您是在说 - 如果 a 和 b 则不管 a 和 b 的值如何都做某事。关于 CONCAT,你=不加入任何东西,所以你根本不需要 CONCAT。 Ypu 可以利用网上的一些 MySQL 教程。
  • 你想让我根据非工作代码猜测你要做什么?
  • 你想用这个查询实现什么?为查询已经可以告诉您的内容引入新列似乎是个坏主意。不要在数据库中冗余存储数据。
  • 您需要解释计算状态的逻辑,否则很难为查询提出相关改进建议。

标签: mysql


【解决方案1】:

您必须将 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 个结果,因此您的构造不起作用-

【讨论】:

  • 我知道问题出在哪里。感谢您为我解答。!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 2014-07-05
  • 1970-01-01
相关资源
最近更新 更多