2017-02-23 69 views
0

У меня есть 2 таблицы: EMP и TMP_EMP, которые оба идентичны. Я использую Oracle.Обновление столбца в таблице на основе значения из другой таблицы

EMP:

+----------+----------+ 
| ID  | ALLOWED | 
+----------+----------+ 
| 1-xx  | 0  | 
| 2-xx  | 1  | 
| 3-xx  | 0  | 
| 4-xx  | 2  | 
+----------+----------+ 

TMP_EMP:

+----------+----------+ 
| ID  | ALLOWED | 
+----------+----------+ 
| 1-xx  | 0  | 
| 2-xx  | 0  | 
| 4-xx  | 0  | 
| 5-xx  | 0  | 
+----------+----------+ 

То, что я хочу сделать, это обновить поле, допускаемые в таблице TMP_EMP и установите его в том же значении, допускаемые в ПУЭ таблица, если сотрудник существует в обеих таблицах. Короче финальный стол TMP_EMP должен выглядеть следующим образом:

TMP_EMP:

+----------+----------+ 
| ID  | ALLOWED | 
+----------+----------+ 
| 1-xx  | 0  | 
| 2-xx  | 1  | 
| 4-xx  | 2  | 
| 5-xx  | 0  | 
+----------+----------+ 

Я написал мое обновление SQL следующим образом:

update TMP_EMP 
set ALLOWED = IC.ALLOWED 
WHERE ID in (
SELECT IC.ID 
FROM TMP_EMP tmp, EMP IC 
where IC.ID LIKE decode(instr(tmp.ID,'-'),0,tmp.ID,substr(tmp.ID,0,instr(tmp.ID,'-')-1)) || '%'); 

Но это не работает. Я был бы очень благодарен за любую помощь здесь. Благодарю.

+0

Пожалуйста, покажите нам, как выглядят различные идентификаторы. –

+0

@TimBiegeleisen: идентификаторы находятся в формате y-xx. Примеры: 1-AB, 1-FD, 2-DW, 2-GF – tabby

+0

Вы можете использовать Merge для этого – Shruti

ответ

1
UPDATE TMP_EMP t1 
SET ALLOWED = (SELECT ALLOWED 
       FROM EMP t2 
       WHERE t2.ID LIKE DECODE(INSTR(t1.ID, '-'), 0, t1.ID, 
             SUBSTR(t1.ID, 0, INSTR(t1.ID, '-')-1)) || '%') 
WHERE EXISTS (SELECT ALLOWED 
       FROM EMP t2 
       WHERE t2.ID LIKE DECODE(INSTR(t1.ID, '-'), 0, t1.ID, 
             SUBSTR(t1.ID, 0, INSTR(t1.ID, '-')-1)) || '%') 
+0

Я использую Oracle. – tabby

+0

Это не работает. Я получаю следующую ошибку: Ошибка SQL: ORA-01427: однострочный подзапрос возвращает более одной строки 01427. 00000 - «однострочный подзапрос возвращает более одной строки». Я действительно просматриваю эту ошибку. – tabby

+0

Тогда ваши данные имеют проблемы. Вы должны предоставить нам логику относительно того, что должно произойти, если идентификатор соответствует нескольким записям. –

0

Не пробовал в оракуле, но я бы использовал CTE для этого.

;with tmp as (
    SELECT IC.ID 
    FROM TMP_EMP tmp, EMP IC 
    where IC.ID LIKE decode(instr(tmp.ID,'-'),0,tmp.ID,substr(tmp.ID,0,instr(tmp.ID,'-')-1)) || '%'); 
) 
update te 
set te.ALLOWED = tmp.ALLOWED 
from TMP_EMP te 
inner join tmp on tmp.ID = te.ID 
+0

Обновление соединений в Oracle невозможно. –

+1

Я парень SQL Server ... не знал, что ... спасибо за упоминание :) – Kostis

+0

Да, это главный недостаток Oracle, что мы должны использовать действительно уродливые запросы для обновления. –