簡體   English   中英

sql - 在子查詢和同一個表中更新

[英]sql - update in subquery & same table

我想更新多行數據,但發生錯誤。

下面是表信息和查詢語句。

我的表

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:您無法在 FROM 子句中為“myTable”更新指定目標表

問題出在哪兒?

我想看后續圖片

請幫忙~!

在此處輸入圖片說明

您必須用 SELECT 封裝 mytable

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子句,所以可能會發生在更遠的路上,結果可能會改變

基本上一切都是正確的 o 告訴你的但你的查詢有另一個問題

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);
\n子查詢返回超過 1 行\n
 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%' )
\n |  CONCAT(ltiNum,ltiCd) |\n |  :-------------------- |\n |  1A |\n |  30 |\n |  4D |\n |  5E |\n
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%' )
\n |  CONCAT(ltiNum,ltiCd) |\n |  :-------------------- |\n |  6F |\n
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%' )
\n |  CONCAT(ltiNum,ltiCd) |\n |  :-------------------- |\n |  2B |\n

db<> 在這里擺弄

如您所見,第一個 CASE 返回 4 個結果,因此您的構建不起作用-

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM