2016-07-22 10 views
0

У меня есть две таблицы с именем Employee и Time. Я хочу назначить OnTrack=y, если все TaskList кода сотрудника 1E являются 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') 

Мой код обновляет только один ряд. Кто-нибудь может помочь?

Сотрудник таблица:

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

Какие РСУБД это? Добавьте тег, чтобы указать, используете ли вы '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, и если как и результаты, используйте обновление ниже. Его трудно писать код, не видя таблиц, а просто следуя своим объяснениям, это должно поставить вас в правильном направлении.

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' 

Dont запустить это, не пытаясь выше выбрать

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 по умолчанию включил Autocommit. Есть способы отключить это и сделать то, что вы предлагаете, но это выходит за рамки этой темы. Тем не менее, хорошая точка зрения. – objectNotFound

+0

@ user3331421 Предлагаю вам показать свои таблицы и ожидаемые результаты, отредактировав основной вопрос. – objectNotFound

Смежные вопросы