2016-07-22 3 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 상태가 모든 직원 코드가 타임 테이블에 '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를 사용하는 것으로 가정)이 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을 사용할 때 '트랜잭션 시작'을 사용하는 것이 좋습니다. 트랜잭션을 '롤백'하고 '트랜잭션 완료'를 사용하면됩니다. – Standage

+0

@Standage SQLServer는 기본적으로 자동 커밋을 설정합니다. 이 스레드의 범위를 벗어난 것을 해제하고 제안한 작업을 수행 할 수있는 방법이 있습니다. 그럼에도 불구하고 좋은 지적. – objectNotFound

+0

@ user3331421 주요 질문을 편집하여 테이블과 예상 결과를 표시하는 것이 좋습니다. – objectNotFound

관련 문제