我假設你正在試圖做的是平均了所有家庭成員的議案?如果是這樣,那麼可以在一個單一的查詢完成:
WITH table1 AS (SELECT 'bob' NAME, 'jones' family_name, 0 bill FROM dual UNION ALL
SELECT 'jane', 'jones', 100 bill FROM dual UNION ALL
SELECT 'fred', 'jones', 50 bill FROM dual UNION ALL
SELECT 'bill', 'smith', 0 bill FROM dual UNION ALL
SELECT 'brenda', 'smith', 60 bill FROM dual UNION ALL
SELECT 'jill', 'smith', 0 bill FROM dual UNION ALL
SELECT 'bob', 'ingles', 0 bill FROM dual UNION ALL
SELECT 'carol', 'ingles', 0 bill FROM dual UNION ALL
SELECT 'rob', 'carolgees', 200 bill FROM dual)
-- end of mimicking your table1 with sample data in it - you wouldn't need this
-- see the SQL below
SELECT NAME,
family_name,
bill,
AVG(bill) OVER (PARTITION BY family_name) split_bill
FROM table1;
NAME FAMILY_NAME BILL SPLIT_BILL
------ ----------- ---------- ----------
rob carolgees 200 200
carol ingles 0 0
bob ingles 0 0
fred jones 50 50
bob jones 0 50
jane jones 100 50
jill smith 0 20
bill smith 0 20
brenda smith 60 20
它使用AVG()
解析函數在整個家庭所有成員平分賬單,而不壓縮像AVG()
聚合函數會做行。
然後,如果您需要更新表1反映共享賬單,那麼你可以插入上述查詢到MERGE
聲明,是這樣的:
merge into table1 tgt
using (select name,
family_name,
bill,
avg(bill) over (partition by family_name) split_bill
from table1) src
on (tgt.name = src.name and tgt.family_name = src.family_name)
when matched then
update set tgt.bill = src.split_bill
where tgt.bill != src.split_bill;
其實完全沒有必要使用一個緩慢的光標此。這可以通過單個SQL查詢 –
@a_horse_with_no_name完成,你可以幫我嗎? http://stackoverflow.com/questions/41541100/fetch-table-name-from-a-column-for-from-clause – Akshay