2016-06-07 9 views
0

Вот запрос, который у меня есть до сих пор, и я понимаю, ПОЧЕМУ он не работает ... Просто сложно создать решение.Обновление нескольких строк на основе других значений столбцов таблицы

UPDATE wrkque 
SET locacc = (SELECT locmst.locacc 
      FROM locmst, 
       wrkque 
      WHERE locmst.stoloc = wrkque.srcloc 
      AND wrkque.oprcod = 'TRN') 
WHERE wrkque.oprcod = 'TRN' 
AND wrkque.srcloc IN (SELECT locmst.stoloc 
         FROM locmst, 
          wrkque 
         WHERE locmst.stoloc = wrkque.srcloc) 

Внутренний запрос возвращает несколько строк. Я считаю, что мне нужно сделать запрос по типу по типу, но он не уверен.

По существу, мне нужно обновить таблицу wrkque, чтобы обновить все экземпляры строк из «TRN» (Transfers), чтобы отразить «locacc» (Location Access) из таблицы locmst.

Ключом к связыванию обеих строк таблиц с eachother является locmst.stoloc и wrkque.srcloc.

Любая помощь ВОЗМОЖНО высоко ценится.

ответ

2

Попробуйте это:

UPDATE wrkque 
SET locacc = (SELECT locmst.locacc 
       FROM locmst 
       WHERE locmst.stoloc = wrkque.srcloc) 
WHERE wrkque.oprcod = 'TRN' 

внутренний запрос должен ссылаться на внешний запрос, который мы делаем здесь: WHERE locmst.stoloc = wrkque.srcloc. Нам не нужно объединение внутри внутреннего запроса, нам просто нужна ссылка.

РЕДАКТИР EXISTS:

Как Гордон отмечает в своем ответе, вы должны включать в себя положение EXISTS корреляции во внешнем запросе, а также:

UPDATE wrkque 
SET locacc = (SELECT locmst.locacc 
       FROM locmst 
       WHERE locmst.stoloc = wrkque.srcloc) 
WHERE wrkque.oprcod = 'TRN' 
AND EXISTS (SELECT locmst.stoloc 
      FROM locmst 
      WHERE locmst.stoloc = wrkque.srcloc) 

Без этого любые строки, которые делают не соответствует locmst.stoloc = wrkque.srcloc (есть в wrkque, но не в locmst) будет иметь locacc установлен на null. Если каждая строка существует в обеих таблицах, вы можете ее оставить, но лучше всегда включать ее.

+1

Sheesh, спасибо Аарон. Позволяет просто сказать, что я уже думал об этом ... lol – user3642066

2

Эти типы обновлений сложны. Ваша основная проблема заключается в том, что в подзапросе есть join, когда вы должны использовать предложение корреляции. Вы должны сделать это как для set и where:

UPDATE wrkque 
    SET locacc = (SELECT locmst.locacc 
        FROM locmst 
        WHERE locmst.stoloc = wrkque.srcloc 
       ) 
    WHERE wrkque.oprcod = 'TRN' AND 
      EXISTS (SELECT locmst.stoloc 
        FROM locmst 
        WHERE locmst.stoloc = wrkque.srcloc 
       ); 

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

+0

Спасибо! Этот тоже работает. – user3642066

0

Попробуйте

UPDATE (SELECT locmst.locacc newOne, wrkque.locacc oldOne 
      FROM locmst, wrkque 
      WHERE locmst.stoloc = wrkque.srcloc 
      AND wrkque.oprcod = 'TRN') t 
SET t.oldOne = t.newOne;