2016-07-22 61 views
0

我有两个表名为EmployeeTime。如果员工代码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的状态应为如果所有的员工代码具有的“是”时间表更新如下所示:

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)尝试先选择stmt,然​​后if像结果使用下面的更新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'的好习惯,这种方式你总是可以'回滚事务',一旦你开心使用'commit transaction' – Standage

+0

@Standage默认SQLServer打开Autocommit。有很多方法可以关闭它,做你的建议,但那超出了这个线程的范围。尽管如此,好点。 – objectNotFound

+0

@ user3331421我建议你通过编辑你的主要问题来展示你的表格和预期结果。 – objectNotFound

相关问题