子查询中的订单BY:缺少右括号

时间:2018-04-20 08:34:10

标签: sql oracle

我尝试使用具有特定顺序的子查询更新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 source1 w
                                              , source2 d
                                           WHERE 1=1
                                           -- Some conditions
                                            GROUP BY d.business_unit, d.voucher_id
                                            ORDER BY d.business_unit, d.voucher_id);

为什么我会:

  

ORA-00907:缺少右括号

编辑1

包含所有条件的查询:

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 source1 w 
  , source2 d 
 WHERE w.business_unit = TAO.BUSINESS_UNIT 
   AND d.business_unit = w.business_unit 
   AND d.voucher_id = w.voucher_id 
   AND d.VOUCHER_LINE_NUM = w.VOUCHER_LINE_NUM 
   AND d.VOUCHER_ID = TAO.VOUCHER_ID 
  GROUP BY d.business_unit, d.voucher_id
  ORDER BY d.business_unit, d.voucher_id )

2 个答案:

答案 0 :(得分:0)

子查询具有group by子句,可以返回多行。 更新查询无法获取要更新的值列表。

因此,对于d.business_unit, d.voucher_id的每个唯一组合,即使您未在内部查询中选择这些列,也会有一行。

此外,假设它只返回一行,则缺少更新查询的where子句。只有我可以看到的子句在子查询中。

答案 1 :(得分:0)

您似乎想要一个相关的子查询,因为您的子查询可以返回多行。

您没有提供表格布局,但我希望:

UPDATE myTable TAO
  SET (BASE_AMT, TAX_CD_VAT_PCT) =
          (SELECT SUM(d.monetary_amount),  -- the DECODE does nothing
                  MAX(D.TAX_CD_VAT_PCT)
           FROM source1 w JOIN  -- ALWAYS use proper, explicit, standard JOIN syntax
                source2 d
                ON . . . 
           WHERE . . . AND
                 d.business_unit = TAO.business_unit AND
                 d.voucher_id = TAO.voucher_id
          );

您的代码充满了时代错误和不良做法:

  • DECODE()什么也没做。如果是,则应使用CASE表达式。
  • JOIN条款中的逗号已经过时十五年了。使用正确,明确,标准的JOIN语法。
  • 子查询中的ORDER BY什么都不做。