SQL的区别是什么

时间:2013-11-27 04:19:32

标签: sql database

我没有广泛使用数据库,但我可以编写选择,更新,小连接等。 我可以用我目前的知识完成我的工作。我在尝试完成任务时遇到了一些困难,我完成了任务但想了解为什么我在编写过程中编写的某些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不同。

非常感谢帮助。

谢谢,

2 个答案:

答案 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。

在这个版本中,您可以简单地使用一个表 - 在每一行上根据该行中的数据在该行上设置一个值。

在你的最终版本中,你是以相同的方式做同样的事情(多余的连接不做任何事情)。