2013-06-07 4 views
0

T1.LEID необходимо ОБНОВИТЬСЯ с значениями T1.ID от Строки, в которых совпадают как MSID, так и ESTID.Oracle 11g - Обновление сопоставленных строк со значениями из исходной таблицы

Я поворачивал мой синтаксис вокруг и попробовал несколько вариантов, но всегда в конечном итоге с той же ошибкой 01427.

UPDATE T1 
SET LEID = (SELECT T2.id 
       FROM T2 
       WHERE T2.MSID = T1.MSID) 
WHERE EXISTS (SELECT T2.id 
      FROM T2 
      WHERE T2.ESTID = T1.ESTID 
     ); 

ORA-01427: single-row subquery returns more than one row 


{  CREATE TABLE T1 
(
    { 

    ESTID NUMBER(8), 
     MSID NUMBER(8), 
     SMID NUMBER(8), 
     LEID NUMBER(8) 
    ) 
    NOLOGGING 
    NOCOMPRESS 
    NOCACHE 
    NOPARALLEL 
    MONITORING; 

    Insert into T1 
    (ESTID, MSID, SMID, LEID) 
    Values 
    (545, 5454, 888, NULL); 
    Insert into T1 
    (ESTID, MSID, SMID, LEID) 
    Values 
    (334, 5555, 6541, NULL); 
    Insert into T1 
    (ESTID, MSID, SMID, LEID) 
    Values 
    (254, 4487, 888, NULL); 
    Insert into T1 
    (ESTID, MSID, SMID, LEID) 
    Values 
    (659, 54518, 654, NULL); 
    Insert into T1 
    (ESTID, MSID, SMID, LEID) 
    Values 
    (854, 8548, 85478, NULL); 
    Insert into T1 
    (ESTID, MSID, SMID, LEID) 
    Values 
    (658, 12485, 254, NULL); 
    Insert into T1 
    (ESTID, MSID, SMID, LEID) 
    Values 
    (444, 5555, 888, NULL); 
    Insert into T1 
    (ESTID, MSID, SMID, LEID) 
    Values 
    (444, 5545, 888, NULL); 
    Insert into T1 
    (ESTID, MSID, SMID, LEID) 
    Values 
    (444, 4444, 888, NULL); 
    Insert into T1 
    (ESTID, MSID, SMID, LEID) 
    Values 
    (555, 5555, 999, NULL); 
    Insert into T1 
    (ESTID, MSID, SMID, LEID) 
    Values 
    (444, 3333, 5, NULL); 
     COMMIT; } 

    CREATE TABLE T2 
    (
    ESTID NUMBER(8), 
    MSID NUMBER(8), 
    ID  NUMBER(8) 
    ) 
    NOLOGGING 
    NOCOMPRESS 
    NOCACHE 
    NOPARALLEL 
    MONITORING; } 

Insert into T2 


    {(ESTID, MSID, ID) 
    Values 
    (545, 5454, 14); 
    Insert into T2 
    (ESTID, MSID, ID) 
    Values 
    (334, 5555, 16); 
    Insert into T2 
    (ESTID, MSID, ID) 
    Values 
    (254, 4487, 18); 
    Insert into T2 
    (ESTID, MSID, ID) 
    Values 
    (659, 54518, 20); 
    Insert into T2 
    (ESTID, MSID, ID) 
    Values 
    (854, 8548, 22); 
    Insert into T2 
    (ESTID, MSID, ID) 
    Values 
    (658, 12485, 24); 
    Insert into T2 
    (ESTID, MSID, ID) 
    Values 
    (444, 5555, 26); 
    Insert into T2 
    (ESTID, MSID, ID) 
    Values 
    (444, 5545, 28); 
    Insert into T2 
    (ESTID, MSID, ID) 
    Values 
    (444, 4444, 30); 
    Insert into T2 
    (ESTID, MSID, ID) 
    Values 
    (555, 5555, 32); 
    Insert into T2 
    (ESTID, MSID, ID) 
    Values 
    (444, 3333, 34); 
    COMMIT; } 

бы признателен за любую помощь или предложения о том, как изменить scriupt топ обновления на ropws в T1.

ответ

2

Если обе колонки, ИИМС и ESTID должны соответствовать, следующие должны сделать трюк:

UPDATE T1 
    SET LEID = (SELECT T2.id 
       FROM T2 
       WHERE T2.MSID = T1.MSID AND T2.ESTID = T1.ESTID) 
WHERE EXISTS (SELECT T2.id 
       FROM T2 
       WHERE T2.MSID = T1.MSID AND T2.ESTID = T1.ESTID);  
11 rows updated. 
+0

Если таблицы больше, я бы использовал команду слияния: 'MERGE INTO T1 ИСПОЛЬЗОВАНИЕ T2 ON (T2.MSID = T1.MSID AND T2.ESTID = T1.ESTID) КОГДА СООТВЕТСТВУЕТ ТОГДА UPDATE SET LEID = T2 .ID; ' –

+0

Оба подхода будут работать только в том случае, если (MSID, ESTID) уникален в таблице T2, например, защищен уникальным ограничением' ALTER TABLE T2 ADD CONSTRAINT T2_UQ UNIQUE (MSID, ESTID); ' –

+0

Я был уверен, что у меня было пробовал это, но не смог найти в моей истории травм, и он, конечно, обновляет строки в образце. В больших таблицах, все еще опасаясь 1427 ... нужны ли ограничения, или будет ли тот факт, что они уникальны? Сейчас я думаю, что в больших таблицах они действительно не уникальны. Спасибо вам за ваш вклад. –

0

UPDATE T1 SET Leid = (SELECT t2.id ОТ T2 ГДЕ T2.MSID = T1 .MSID AND T2.ESTID = T1.ESTID);

+1

Этот запрос снова вызовет ту же ошибку ORA-01427: однострочный подзапрос возвращает более одной строки, если комбинация MSID и ESTID в таблице T2 не является уникальным ключом. – Prosenjit