如何更新与其他表连接的表中的列?

时间:2013-04-17 13:40:54

标签: sql oracle sql-update

我想要参考其他表来更新表的两列。执行脚本时显示错误。

错误:在命令的第1行开始出错:

UPDATE wb_costing_work_items,
       sa_sales_documents,
       sa_sales_document_items
   SET cwi_price_per_hour = sdi_price,
       cwi_amount = sdi_price * cwi_hours
 WHERE cwi_lo_id = sad_lo_id
   AND sdi_sad_id = sad_id
   AND sdi_wit_id = cwi_wit_id
   AND cwi_id = 1650833
  

命令行错误:1列:28错误报告:SQL错误:ORA-00971:   缺少SET关键字   00971. 00000 - “缺少SET关键字”

SQL语句

UPDATE wb_costing_work_items cwi,
       sa_sales_documents sad, 
       sa_sales_document_items sdi
   SET cwi.cwi_price_per_hour = sdi.sdi_price,
       cwi.cwi_amount = sdi.sdi_price * cwi.cwi_hours
 WHERE cwi.cwi_lo_id = sad.sad_lo_id
   AND sdi.sdi_sad_id = sad.sad_id
   AND sdi.sdi_wit_id = cwi.cwi_wit_id
   AND cwi.cwi_id = 1650855

2 个答案:

答案 0 :(得分:1)

这绝对有效。

            UPDATE (SELECT cwi_price_per_hour,
                           sdi_price,
                           cwi_amount,
                           sdi_price,
                           cwi_hours
                      FROM wb_costing_work_items,
                           sa_sales_documents,
                           sa_sales_document_items
                     WHERE     cwi_lo_id = sad_lo_id
                           AND sdi_sad_id = sad_id
                           AND sdi_wit_id = cwi_wit_id
                           AND cwi_id = 1650833)
               SET cwi_price_per_hour = sdi_price, cwi_amount = sdi_price * cwi_hours

请为使用的表格添加别名并为列添加前缀,以便您可以轻松阅读查询。

答案 1 :(得分:0)

这样的事可能。

请注意,我必须使用一些关于哪个列属于哪个表的猜测,因为您没有包含有关如何定义表的任何信息。

所以很可能我没有把它弄好,你需要将查询调整到你的实际表格结构。

merge into wb_costing_work_items  
using 
(
    select cwi.pk_column,  -- don't know what the PK of the wb_costing_work_items is due to lack of information
           sdi.sdi_price,  -- don't know if this column really belong to this table
           sdi.sdi_price * cwi.cwi_hours as total-- again unsure about column names due to lack of information
    FROM wb_costing_work_items cwi
      JOIN sa_sales_documents sad ON sad.sad_lo_id = cwi.cwi_lo_id -- not sure about these, due to lack of information
      JOIN sa_sales_document_items sdi 
        ON sdi.sad_id = sad.sdi_sad_id     -- not sure about these, due to lack of information
       AND sdi.sdi_wit_id = cwi.cwi_wit_id -- not sure about these, due to lack of information

) t ON (t.pk_column = w.pk_column) -- not sure about this, due to lack of information
when matched then 
 update 
    set cwi_price_per_hour = t.sdi_price,
        cwi_amount = t.total;