2016-07-22 21 views
0

EmployeeTimeの2つのテーブルがあります。従業員コード1EのTaskListがすべてyの場合はOnTrack=yを割り当てたい。SQL内のテーブル値に基づいて他のテーブルを更新

私はこれを試してみましたが、私は私のコードは一列のみを更新している

UPDATE Employee 
SET OnTrack = 'y' 
FROM Employee e 
WHERE e.Code IN 
INNER JOIN (SELECT EmployeeCode FROM Time WHERE status = 'P') permanent 
ON permanent.Employeecode = e.Code 
AND permanent.Employeecode NOT IN 
(SELECT EmployeeCode FROM Time t WHERE t.EmployeeCode=permanent.Employeecode and t.tasklist<>'y') 

こだわっています。誰でも助けてくれますか?

Employeeテーブル:

Code Name Hours OnTrack 
*********************************** 
1E  SCOTT 32 
2E  LISA  32 
3E  MARK  32 

タイムテーブルが

Code Employeecode Status workingHours TaskList 
******************************************************** 
1A   1E    P  8    Y 
2A   1E    P  8    Y 
3A   1E    P  8    N 
4A   2E    T  8    Y 
5A   2E    T  0    Y 
6A   3E    P  8    Y 

従業員表で、Ontrack社の状況は、すべての従業員のコードはタイムテーブルに 'Y' を持っている場合に更新する必要がありますされて期待したものの結果であります

Code Name Hours OnTrack 

1E  SCOTT 24  N 
2E  LISA  12  Y 
3E  MARK  0  Y 
+2

どのようにクエリが機能するかわかりません。 –

+1

これはどのRDBMSですか? 'mysql'、' postgresql'、 'sql-server'、' oracle'、 'db2'のどれかを指定するタグを追加してください。 –

+0

@ user3331421最新のアップデートをフォーマットして、読めるようにしてください。 – objectNotFound

答えて

1

選択しようとせずにこれを実行します。これはどう:

DECLARE @Time TABLE (Code VARCHAR(2),Employeecode VARCHAR(2),Status CHAR(1), 
        WorkingHours INT, TaskList CHAR(1)) 
INSERT @Time 
VALUES ('1A','1E','P',8,'Y'), 
     ('2A','1E','P',8,'Y'), 
     ('3A','1E','P',8,'N'), 
     ('4A','2E','T',8,'Y'), 
     ('5A','2E','T',0,'Y'), 
     ('6A','3E','P',8,'Y') 
DECLARE @Employee TABLE (Code CHAR(2), Name VARCHAR(10), Hours INT, OnTrack CHAR(1)) 
INSERT @Employee 
VALUES ('1E','SCOTT',32,NULL), 
     ('2E','LISA',32,NULL), 
     ('3E','MARK',32,NULL) 

UPDATE e 
SET e.OnTrack = t.TaskList 
FROM @Employee e 
JOIN (SELECT Employeecode, MIN(TaskList) TaskList 
     FROM @Time 
     GROUP BY Employeecode) t ON E.Code = T.Employeecode 

SELECT * 
FROM @Employee 

結果:あなたが唯一の永久的な従業員を更新したい場合は

Code Name Hours OnTrack 
1E  SCOTT 32  N 
2E  LISA 32  Y 
3E  MARK 32  Y 

することは、単にサブクエリにStatusを追加します。

SELECT Employeecode, MIN(TaskList) TaskList 
    FROM @Time 
    WHERE Status = 'p' 
    GROUP BY Employeecode 
1

(SQL Serverを使用していると仮定します)これを最初に選択してください。結果のように、以下のupdate stmtを使用してください。そのテーブルを見ずにコードを書くのは難しいですが、ちょうどあなたの説明によると、これは正しい方向にあなたを置くはずです。

select * 
FROM Employee e 
INNER JOIN TIME t1 ON t1.EmployeeCode = e.code 
INNER JOIN TIME t2 ON t2.EmployeeCode <> e.code 
WHERE t1.status = 'P' 
AND t2.tasklist <> 'y' 

いけない以上は、私がテストデータをいくつかのテーブル変数を作成した

UPDATE Employee 
SET OnTrack = 'y' 
FROM Employee e 
INNER JOIN TIME t1 ON t1.EmployeeCode = e.code 
INNER JOIN TIME t2 ON t2.EmployeeCode <> e.code 
WHERE t1.status = 'P' 
AND t2.tasklist <> 'y' 
+0

SQLを使用しているときに 'begin transaction'を使用することをお勧めします。トランザクションをいつでもロールバックして、トランザクションをコミットすることができます。 – Standage

+0

@Standage SQLServerでは、デフォルトでオートコミットが有効になっています。これをオフにして、あなたが提案したことをする方法はありますが、このスレッドの範囲を超えています。それにもかかわらず、良い点。 – objectNotFound

+0

@ user3331421主な質問を編集して、テーブルと期待される結果を表示することをお勧めします。 – objectNotFound

関連する問題