无法将值更新为同一表中两个现有值的总和(MySQL)

无法将值更新为同一表中两个现有值的总和(MySQL),mysql,sql-update,Mysql,Sql Update,这是我第一次在Stack Overflow中提问 无论如何,本周早些时候,我进行了一次关于我使用SQL的技能的测试。。而且,一个特别的问题完全把我难住了。。这是关于使用“更新”命令 问题是‘用维杰和苏尼尔的工资总额更新维杰的工资 以下是用于此目的的表格 mysql> SELECT * FROM emp_company; +--------+-------+----------+------------+ | ename | cname | salary | jdate |

这是我第一次在Stack Overflow中提问

无论如何,本周早些时候,我进行了一次关于我使用SQL的技能的测试。。而且,一个特别的问题完全把我难住了。。这是关于使用“更新”命令

问题是‘用维杰和苏尼尔的工资总额更新维杰的工资

以下是用于此目的的表格

mysql> SELECT * FROM emp_company;
+--------+-------+----------+------------+
| ename  | cname | salary   | jdate      |
+--------+-------+----------+------------+
| Sunil  | ACC   | 15000.00 | 2003-12-12 |
| Vijay  | ACC   | 21000.00 | 2011-06-11 |
| Ishi   | TATA  | 40000.00 | 2011-03-14 |
| Mahesh | GMM   |  9000.00 | 2015-01-01 |
| Anjali | WIPRO | 25000.00 | 2013-04-21 |
+--------+-------+----------+------------+
5 rows in set (0.13 sec)
所以

期望结果:我需要将Vijay的工资设置为他和Sunil的总和,结果应该是36000

我使用这个特殊的查询来回答它,但失败了

UPDATE emp_company 
-> SET salary = (SELECT SUM(salary)
->               FROM emp_company
->               WHERE ename = 'Sunil' OR ename = 'Vijay')
-> WHERE ename = 'Vijay';
但是,以下错误消息显示我失败:

ERROR 1093 (HY000): You can't specify target table 'emp_company' for update in FROM clause
另外,在阅读了StackOverflow中的一些其他讨论之后,我觉得这些讨论可以回答我的问题,我尝试了这个特殊的查询

mysql> UPDATE emp_company EC1, (SELECT SUM(salary)
    ->                          FROM emp_company
    ->                          WHERE ename = 'Sunil' OR ename = 'Vijay') EC2
    -> SET EC1.salary = EC2.salary
    -> WHERE EC1.name = 'Vijay';
再次出现一条错误消息,通知我失败了。。这一次,声明有点不同:

ERROR 1054 (42S22): Unknown column 'EC1.name' in 'where clause'
因此,如果有人能指导我或让我离解决方案更近一步,那将是很大的帮助

另外,当我检查子查询时,它显示了所需的结果

mysql> SELECT SUM(salary)
    -> FROM emp_company
    -> WHERE ename = 'Vijay' OR ename = 'Sunil';
+-------------+
| SUM(salary) |
+-------------+
|    36000.00 |
+-------------+
1 row in set (0.01 sec)
我是一名本科学生,攻读计算机科学理工学士学位

PS2:因为,我是这个论坛的新手(不是技术上的,因为我一直在使用这个网站寻找我很多问题的答案),但这是我第一次发布问题。。因此,如果我在构思问题时犯了任何错误,请温柔地告诉我


抱歉,发布了这么多信息。。但是,在发布问题时,它是为了提供尽可能多的信息,所以我做了

执行如下的更新联接,但最好有一个键列,如
ID
,对其执行比较,因为名称可能重复,在这种情况下,您将更新错误的记录

UPDATE emp_company ec
JOIN (SELECT ename, SUM(salary) AS targetsal
              FROM emp_company
              WHERE ename = 'Sunil' OR ename = 'Vijay') xx ON ec.ename = xx.ename
SET ec.salary = xx.targetsal
WHERE ec.ename = 'Vijay';

执行下面这样的更新联接,但您最好有一个键列,如
ID
,您将对其执行比较,因为名称可能重复,在这种情况下,您将更新错误的记录

UPDATE emp_company ec
JOIN (SELECT ename, SUM(salary) AS targetsal
              FROM emp_company
              WHERE ename = 'Sunil' OR ename = 'Vijay') xx ON ec.ename = xx.ename
SET ec.salary = xx.targetsal
WHERE ec.ename = 'Vijay';

您可以添加另一个选择,如下所示:

UPDATE emp_company 
SET salary = (SELECT salary from (select SUM(salary) as salary
           FROM emp_company
           WHERE ename = 'Sunil' OR ename = 'Vijay') t)
WHERE ename = 'Vijay';

检查我的sqlfiddle:

您可以添加另一个选择,如下所示:

UPDATE emp_company 
SET salary = (SELECT salary from (select SUM(salary) as salary
           FROM emp_company
           WHERE ename = 'Sunil' OR ename = 'Vijay') t)
WHERE ename = 'Vijay';

检查我的sqlfiddle:

Sunil被解雇了吗?Sunil被解雇了吗?这对我来说非常有效。。。但是,我可以请你解释/详细说明上述陈述吗。。根据我的理解,我认为,您使用我的子查询作为另一个临时表或子查询的子查询(输入)。。。但是,当我在没有使用“AS”命令的情况下使用上述语句时,它不起作用。。如果可能的话,你能解释一下原因吗?…这里使用的AS给列-salary提供了一个别名,否则你将无法在外部查询中引用salary列。作为旁注,我在这里使用了salary作为别名,但是它可以是任何类似于xyz的东西,只要外部查询以该名称(即xyz)引用它。这对我来说非常有效。。。但是,我可以请你解释/详细说明上述陈述吗。。根据我的理解,我认为,您使用我的子查询作为另一个临时表或子查询的子查询(输入)。。。但是,当我在没有使用“AS”命令的情况下使用上述语句时,它不起作用。。如果可能的话,你能解释一下原因吗?…这里使用的AS给列-salary提供了一个别名,否则你将无法在外部查询中引用salary列。作为旁注,我在这里使用了salary作为别名,但是它可以是任何类似于xyz的东西,只要外部查询以该名称(即xyz)引用它。