我尝试使用具有特定顺序的子查询更新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 )
答案 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
什么都不做。