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