Sql 使用sum()更新表列

Sql 使用sum()更新表列,sql,sql-server,Sql,Sql Server,我试图用我的SQL代码做两件事。我希望它从另一个表(works-table)中的另一列(hours)复制数据,并将其放入另一个表(Employee-table)中的新列(numHours)中。但是,我希望它使用每个员工id(eid)的工时总和,然后将该总和放入新列中 这是我写的,但有两件事是错的。当我只执行select语句时,每个员工id的工作小时数相同。当我运行整个语句时,我得到了这个错误 子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时。 声明已终止 UPDATE Empl

我试图用我的SQL代码做两件事。我希望它从另一个表(works-table)中的另一列(hours)复制数据,并将其放入另一个表(Employee-table)中的新列(numHours)中。但是,我希望它使用每个员工id(eid)的工时总和,然后将该总和放入新列中

这是我写的,但有两件事是错的。当我只执行select语句时,每个员工id的工作小时数相同。当我运行整个语句时,我得到了这个错误

子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时。 声明已终止

UPDATE Employee
SET numHours= (SELECT sum(w.hours) AS totalHours From works w, Employee e WHERE
numHours IS NULL AND e.eid = w.eid Group by w.eid);
这些是我的桌子

CREATE TABLE Employee(
eid INT,
ename VARCHAR(30),
age INT,
salary INT,

CONSTRAINT Pk_key_eid PRIMARY KEY (eid)
);

CREATE TABLE Department(
did INT,
dname VARCHAR(30),
budget int,
managerid INT,

CONSTRAINT Validate_managerid CHECK(managerid < 1000), 
CONSTRAINT Pk_key_did PRIMARY KEY (did)
);

CREATE TABLE Works(
eid INT,
did INT,
hours INT,

CONSTRAINT fk_key_eid FOREIGN KEY (eid) REFERENCES Employee (eid) ON DELETE CASCADE,
CONSTRAINT fk_key_Did  FOREIGN KEY (did) REFERENCES Department (did) ON DELETE CASCADE
);
createtableemployee(
eid INT,
艾娜瓦查尔(30岁),
年龄智力,
工资整数,
约束主键eid主键(eid)
);
创建表格部门(
没有INT,
dname VARCHAR(30岁),
预算整数,
managerid INT,
约束验证\u managerid检查(managerid<1000),
约束Pk\U键\U did主键(did)
);
创建表格工程(
eid INT,
没有INT,
小时整数,
约束fk_key_eid外键(eid)在删除级联上引用员工(eid),
删除级联上的约束fk_key_Did外键(Did)引用部门(Did)
);

我该如何正确地编写此代码?

我相信您希望:

UPDATE Employee
    SET numHours= (SELECT sum(w.hours) From works w WHERE employee.eid = w.eid)
    WHERE numHours IS NULL;
注:

  • numHours
    上的条件属于
    UPDATE
    ,而不是子查询
  • 您需要的是相关查询,而不是完全联接(并且永远不要在
    FROM
    子句中使用逗号!)
  • 子查询中不需要列别名
  • 子查询中不需要
    groupby

我相信你想要这个:

UPDATE Employee
    SET numHours= (SELECT sum(w.hours) From works w WHERE employee.eid = w.eid)
    WHERE numHours IS NULL;
注:

  • numHours
    上的条件属于
    UPDATE
    ,而不是子查询
  • 您需要的是相关查询,而不是完全联接(并且永远不要在
    FROM
    子句中使用逗号!)
  • 子查询中不需要列别名
  • 子查询中不需要
    groupby
使用连接和更新:

UPDATE E
SET E.numHours=H.totalHours 
FROM Employee E JOIN
    (Select sum(hours) AS totalHours,eid  
     From works  
     Group by eid)H on H.eid=E.eid
WHERE E.numHours IS NULL
说明:

内部查询将选择每个员工的总小时数。然后使用它来更新员工表。

使用连接和更新:

UPDATE E
SET E.numHours=H.totalHours 
FROM Employee E JOIN
    (Select sum(hours) AS totalHours,eid  
     From works  
     Group by eid)H on H.eid=E.eid
WHERE E.numHours IS NULL
说明:


内部查询将选择每个员工的总小时数。然后用它来更新
Employee
表。

用你正在使用的数据库标记你的问题。用你正在使用的数据库标记你的问题。@TickleMonster。不需要显式的
join
。相关子查询似乎做了您想做的事情。@TickleMonster。不需要显式的
join
。相关子查询似乎可以执行您想要的操作。