2017-07-07 10 views
0

私はSQLコードで2つのことをしようとしています。別のテーブル(work-table)にある別の列(時間)からデータをコピーし、それを別のテーブル(Employee-table)の新しい列(numHours)に配置します。しかし、各従業員ID(eid)の作業時間の合計を使用して、その合計を新しい列に配置する必要があります。sum()を使用してテーブルの列を更新

これは私が書いたものですが、2つのことが間違っています。 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 
); 

どのように私はこれを適切にコーディングしていますか?

+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。 。 。明示的な 'join'は不要です。相関サブクエリは、あなたが望むことをするようです。 –

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テーブルを更新します。

関連する問題