【问题标题】:Mysql 1093 - Table is specified twiceMysql 1093 - 表被指定了两次
【发布时间】:2020-03-07 06:28:36
【问题描述】:

我真的搜索过了,这个问题已经在这里回答了

1093 Error in MySQL table is specified twice

但答案对我没有帮助

我有这个帐户表

但我面临错误 1093 - 尝试更新帐户余额时,表被指定了两次 虽然我给表格取了两个名字 t1 和 t2

UPDATE accounts t1 
SET Account_Balance = Account_Balance+(
    SELECT SUM(Credit)-SUM(Debit) 
    FROM accounts  t2   
    WHERE Account_Id=1
) 

创建帐户表语句

CREATE TABLE `accounts` (
 `Account_Id` int(11) NOT NULL AUTO_INCREMENT,
 `Account_Name` varchar(100) NOT NULL,
 `Account_Name_English` varchar(50) NOT NULL,
 `Account_Balance` decimal(15,2) NOT NULL DEFAULT '0.00',
 `Credit` decimal(15,2) NOT NULL DEFAULT '0.00',
 `Debit` decimal(15,2) NOT NULL DEFAULT '0.00',
 PRIMARY KEY (`Account_Id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8

【问题讨论】:

  • 请通过添加一些示例表数据使这个问题成为一个完整的问题。

标签: mysql


【解决方案1】:

使用别名并不能解决无法在表达式右侧的SELECT 中指定正在更新的表的问题。解决此问题的一种方法是使用多表 UPDATE

UPDATE accounts t1
CROSS JOIN (SELECT SUM(Credit)-SUM(Debit) AS `change`
            FROM accounts
            WHERE Account_Id=1) t2
SET t1.Account_Balance = t1.Account_Balance + t2.change

注意我不确定WHERE Account_Id = 1 的位置是否正确;这会将accounts 中的所有 Account_Balance 字段更新为旧余额加上从Account_Id 1 的更改。如果这是您想要的,这很好,否则您可能需要额外的@ UPDATE 上的 987654330@ 子句,即

UPDATE accounts t1
CROSS JOIN (SELECT SUM(Credit)-SUM(Debit) AS `change`
            FROM accounts
            WHERE Account_Id=1) t2
SET t1.Account_Balance = t1.Account_Balance + t2.change
WHERE Account_Id = 1

或者使用自己的更改更新所有帐户:

UPDATE accounts t1
JOIN (SELECT Account_Id, SUM(Credit)-SUM(Debit) AS `change`
      FROM accounts
      GROUP BY Account_Id) t2 ON t2.Account_Id = t1.Account_Id
SET t1.Account_Balance = t1.Account_Balance + t2.change

这是所有三个正在运行的查询的demo

【讨论】:

  • @PHPFan 请看这个演示,它显示了所有查询,如答案中所述进行更改:dbfiddle.uk/…
猜你喜欢
  • 2018-04-20
  • 1970-01-01
  • 1970-01-01
  • 2019-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-04
  • 2012-09-13
相关资源
最近更新 更多