2016-01-07 2 views
0

TABLE A (ID, АМТ), ТАБЛИЦА B (ID, КОЛ-ВО)Нужна помощь в обновлении таблицы на основе значений из другой таблицы с использованием Oracle SQL

мне нужно умножить A.AMT с B.QTY и обновить эти значения в таблице А. ID смещ_по_столбцы равны в A и B. Это вопрос, который я создал:

UPDATE A 
SET A.AMT = 
    (SELECT A.AMT * B.QTY AS A 
      FROM B JOIN A 
        ON 
       A.ID=B.ID) 
      WHERE EXISTS 
      (SELECT A.AMT * B.QTY AS A 
       FROM B JOIN A 
        ON 
       A.ID=B.ID) 

Об исполнения он возвращает ошибку: однорядный подзапрос возвращает более одной строки.

Не мог бы кто-нибудь помочь мне в этом.

ответ

0

Для начала повторное использование одинаковых имен таблиц без псевдонимов снова и снова трудно просмотреть. Это может также вызвать у вас некоторую путаницу. Поэтому я попытаюсь сломать его. Начните с этого из существующего заявления:

UPDATE A 
SET A.AMT = (SELECT A.AMT * B.QTY AS A 
       FROM B 
        JOIN A ON A.ID=B.ID) 

Вы устанавливаете a.amount = расчет на КАЖДОМ сопрягая пары A/B, потому что вы не гарантируя, что этот запрос связан с идентификатором строки вы обновляете ! Отсюда и возникает ваша ошибка. Вместо этого:

UPDATE A a1 
SET a1.AMT = (SELECT A2.AMT * B.QTY AS tot_amt 
        FROM B 
        JOIN A A2 ON A2.ID=B.ID 
         WHERE a2.ID = a1.ID) -- link back to the ID of the row we are updating! 

КИ, и теперь мы можем добавить обратно в чеке для согласования В строке для этого обновления, в этом случае мы можем избежать присоединяясь к А, как это ненужное и использовать только записи мы работаем на

UPDATE A a1 
SET a1.AMT = (SELECT A2.AMT * B.QTY AS tot_amt 
        FROM B 
        JOIN A A2 ON A2.ID=B.ID 
         WHERE a2.ID = a1.ID) 
WHERE EXISTS 
     (SELECT 1 
      FROM B b2 
      WHERE b2.ID=a1.ID) 

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

+0

Спасибо за запрос Майкл, но запрос по-прежнему возвращает ту же ошибку: «однострочный подзапрос возвращает более одной строки». Есть подсказки? – Dilip

+0

Это вопрос, который я работаю над: UPDATE RA_CUSTOMER_TRX_LINES_ALL_WD a1 SET a1.EXTENDED_AMOUNT = (SELECT a2.EXTENDED_AMOUNT * NVL (ra_cust_trx_line_salesreps_WD.revenue_percent_split, 100)/100 AS EXT_AMOUNT ОТ ra_cust_trx_line_salesreps_WD РЕГИСТРИРУЙТЕСЬ RA_CUSTOMER_TRX_LINES_ALL_WD a2 \t \t \t \t \t НА a2.customer_trx_line_id = ra_cust_trx_line_salesreps_WD.customer_trx_line_id где a2.customer_trx_line_id = a1.customer_trx_line_id) , где существует (выбрать 1 из ra_cust_trx_line_salesreps_WD b2 , где b2.customer_tr x_line_id = a1. customer_trx_line_id); – Dilip

+1

Таким образом, чтобы подзапрос возвращал более одного значения для хотя бы одной записи a1, которая должна быть демонстрационной при запуске: выберите customer_trx_line_id, count (1) из группы RA_CUSTOMER_TRX_LINES_ALL_WD по счету customer_trx_line_id, счетчик (1)> 1, чтобы получить оскорбительные строки. –