【问题标题】:Update multiple columns from select that have more columns从具有更多列的 select 中更新多个列
【发布时间】:2018-04-16 20:59:09
【问题描述】:

我需要从给定查询中更新 2 列,但问题是查询有超过 2 列,所以如果我删除附加列,这是正确的语法:

UPDATE myTable TAO 
  SET (TAO.BASE_AMT,TAO.TAX_CD_VAT_PCT) = ( 
 SELECT SUM(decode(TAX_CD_VAT_PCT 
 , 0 
 , 0 
 ,d.monetary_amount)) 
 , MAX (D.TAX_CD_VAT_PCT) 
  FROM ps_VCHR_LINE_WTHD w 
  , PS_DISTRIB_LINE d 
 WHERE 1=1 
 -- some conditions
  GROUP BY d.business_unit, d.voucher_id 
  ORDER BY 1, 2)

原始查询是这样的:

 SELECT d.business_unit, d.voucher_id,SUM(decode(TAX_CD_VAT_PCT 
 , 0 
 , 0 
 ,d.monetary_amount)) 
 , MAX (D.TAX_CD_VAT_PCT) 
  FROM ps_VCHR_LINE_WTHD w 
  , PS_DISTRIB_LINE d 
 WHERE 1=1 
 -- some conditions
  GROUP BY d.business_unit, d.voucher_id 
  ORDER BY 1, 2)

那么如果我删除d.business_unit, d.voucher_id 会得到相同的结果吗?因为我在删除它时在 SQL 开发人员中尝试过这个,所以我没有得到相同的顶行。

有人可以帮忙吗?

谢谢。

【问题讨论】:

  • 那里发生了各种可怕的事情!您是否真的根据返回多个值的查询来更新表,并期望 ORDER BY 子句“将其全部排序”?
  • 不使用join的传统做法肯定是个问题,不是ANSI-92标准,使用join而不是逗号
  • 如果您想要与以前相同的结果,那么您可能需要将ORDER BY 1, 2 更改为ORDER BY d.business_unit, d.voucher_id。但我强烈建议您在这里重新考虑您的方法。
  • 给我们样本数据和预期结果。如果您删除您提到的 2 列,那么总和会有所不同。
  • 您的问题以与开始时截然不同的方式结束。你到底要什么?你的目标是什么?选择它还是更新它?

标签: sql oracle


【解决方案1】:

使用MERGE 语句。很难确定您如何将更新语句与嵌套选择关联(似乎没有任何关联)但是,假设它位于 business_unitvoucher_id 列上,则类似于:

MERGE INTO my_table dst
USING (
  SELECT d.business_unit,
         d.voucher_id,
         SUM( DECODE( TAX_CD_VAT_PCT, 0, 0, d.monetary_amount ) ) AS total_tax_cd_vat_pct,
         MAX (D.TAX_CD_VAT_PCT) AS max_tax_cd_vat_pct
  FROM   ps_VCHR_LINE_WTHD w 
         INNER JOIN
         PS_DISTRIB_LINE d 
         ON ( /* some conditions here */ )
  WHERE  1=1
         -- some conditions
  GROUP BY
         d.business_unit,
         d.voucher_id
) src
ON (
      src.business_unit = dst.business_unit
  AND src.voucher_id    = dst.voucher_id
)
WHEN MATCHED THEN
  UPDATE SET
   BASE_AMT       = src.total_tax_cd_vat_pct
   TAX_CD_VAT_PCT = src.max_tax_cd_vat_pct;

【讨论】:

    猜你喜欢
    • 2019-03-14
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多