2017-07-07 123 views
0

我想用我的SQL代碼做兩件事。我希望它從另一個列(工作表)中的另一列(小時)複製數據,並將其放入另一個表(Employee-表)中的新列(numHours)中。但是,我希望它使用每個員工ID(eid)工作小時的總和,然後將該總和放入新列。更新表列使用sum()

這是我寫的,但有兩件事是錯誤的。當我執行select語句時,每個員工ID都有相同的工作小時數。當我運行整個聲明時,出現此錯誤

子查詢返回的值超過1個。當子查詢遵循=,!=,<,< =,>,> =或當子查詢用作表達式時,這是不允許的。 該聲明已被終止。

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 
); 

我將如何正確的代碼呢?

+1

用您正在使用的數據庫標記您的問題。 –

回答

1

我相信你想這樣的:

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

注:

  • numHours條件在UPDATE,而不是子查詢所屬。
  • 你想要一個相關的查詢,而不是一個完整的連接(並且不要在以前的FROM子句中使用逗號!)。
  • 子查詢中不需要列別名。
  • 子查詢中不需要GROUP BY
+0

爲什麼沒有一個完整的聯接在這裏工作? – TickleMonster

+0

@TickleMonster。 。 。明確的「加入」是不必要的。相關的子查詢似乎做你想做的事情。 –

1

使用JOIN和UPDATE:

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表。