我没有广泛使用数据库,但我可以编写选择,更新,小连接等。 我可以用我目前的知识完成我的工作。我在尝试完成任务时遇到了一些困难,我完成了任务但想了解为什么我在编写过程中编写的某些SQL不起作用。
手头的任务:我有一个表“TESTTABLE”有5列,第6列是这5列的总和。 目前的表格如下所示:
ID NAME SUB1 SUB2 SUB3 SUB4 SUB5 TOTAL
1 VA 10 20 30 40 50
2 MI 20 40 60 80 10
3 NC 10 30 50 70 90
4 SC 10 20 30 40 50
5 WA 20 40 60 80 15
最后一栏'总计'目前为空。
现在,我需要用总和更新表中的总列(sub1 + sub2 = sub3 + sub4 + sub5)。
在这个过程中,我编写了以下SQL,它确实有用,想了解其中的区别。
Attempt1:
UPDATE TESTTABLE T
SET Total =
SELECT (sub1+sub2+sub3+sub4+sub5)
FROM TESTTABLE TB
WHERE T.ID = TB.ID);
遇到错误: - 错误:(2)不支持这种形式的相关查询 - 考虑重写;
ATTEMPT2:
CREATE TABLE TEMP_TESTTABLE AS( SELECT ID, SUM(sub1+sub2+sub3+sub4+sub5) AS SUB_TOTAL FROM TESTTABLE )
UPDATE TESTTABLE A
SET TOTAL =
(SELECT SUB_TOTAL
FROM TEMP_TESTTABLE B
WHERE B.ID=A.ID);
遇到错误:错误:(2)不支持这种形式的相关查询 - 考虑重写
Attempt3:
UPDATE TESTTABLE
SET TOTAL = SUM(sub1+sub2+sub3+sub4+sub5);
遇到错误:错误:UPDATE语句的集合列表中不允许聚合函数
尝试4-成功的一个;
UPDATE TESTTABLE A
SET TOTAL = B.SUB_TOTAL FROM TEMP_TESTTABLE B
WHERE A.ID=B.ID
尝试4使用在attempt2 [TEMP_TESTTABLE]中创建的临时表为我工作。
我需要一些细节解释,并感谢任何人都可以提供给我,让我知道我的尝试4与1,2,3不同。
非常感谢帮助。
谢谢,
答案 0 :(得分:1)
Attempt1失败,因为子查询应括在括号中。
UPDATE TESTTABLE T
SET Total =
(SELECT (sub1+sub2+sub3+sub4+sub5)
FROM TESTTABLE TB
WHERE T.ID = TB.ID);
Attempt2失败,因为SUM()
函数是聚合函数,要对多行中的值求和,而不是对一行中多列的值求和。
您应该将列重新定义为计算列,如此
Alter table TESTTABLE
add column Total as sub1+sub2+sub3+sub4+sub5
答案 1 :(得分:0)
这是一个典型的Soluion。
UPDATE
TESTTABLE
SET
Total = (sub1+sub2+sub3+sub4+sub5)
其他人失败的原因是你在哪里做了返回多行的子选择。您没有告诉UPDATE不同的行如何从select映射到UPDATE。
在这个版本中,您可以简单地使用一个表 - 在每一行上根据该行中的数据在该行上设置一个值。
在你的最终版本中,你是以相同的方式做同样的事情(多余的连接不做任何事情)。