2016-12-15 79 views
0

我有一個光標,其中包含按姓氏分組的所有人的賬單。現在,我想動態檢查哪個姓氏有違反法律的問題。例如。有亞當斯和佩裏家庭等等。遊標具有家族成員的值,其中一列是族名。現在我檢查未付金額,我發現他們是在亞當斯家庭。現在,我希望我的光標顯示亞當斯家族的所有成員,以便我可以將賬單分發給家人的其他成員。光標在哪裏條件

CURSOR individual_cur is 
select name,family_name, bill from table1; 

CURSOR family_cur is 
    select family_name from table1; 

    for temp in family_cur loop 
    select sum(bill) into extra_bill where family_name is temp.family_name; 

    if extra_bill <>0 then 

    -- Now here I want 
    for temp1 in individual_cur loop *where family_name is temp.family_name* 

    -- How to do this. 
    end loop; 
+1

其實完全沒有必要使用一個緩慢的光標此。這可以通過單個SQL查詢 –

+0

@a_horse_with_no_name完成,你可以幫我嗎? http://stackoverflow.com/questions/41541100/fetch-table-name-from-a-column-for-from-clause – Akshay

回答

1

下面是一個例子

declare 
    -- add family name as parameter 
    -- and use in where clause 
    cursor individual_cur(p_family_name table1.family_name%type) is 
     select name 
      ,family_name 
      ,bill 
     from table1 
     where family_name = p_family_name; 

    --group by family 
    -- and filter on sum(bill)<>0 
    cursor family_cur is 
     select family_name 
     from table1 
     group by family_name 
     having sum(bill)<>0; 
begin 

    for temp in family_cur 
    loop 
     -- select individuals from this family 
     for temp1 in individual_cur(temp.family_name) 
     loop 

      -- do something 
     end loop; 
    end loop; 
end; 

或者只在一個查詢

select name 
     ,family_name 
     ,bill 
    from table1 
    where family_name in (select family_name 
         from table1 
         group by family_name 
         having sum(bill)<>0) 
+0

嘿你能幫助我嗎? http://stackoverflow.com/questions/41541100/fetch-table-name-from-a-column-for-from-from-clause – Akshay

0

我假設你正在試圖做的是平均了所有家庭成員的議案?如果是這樣,那麼可以在一個單一的查詢完成:

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; 
+0

嘿你能幫我嗎? http://stackoverflow.com/questions/41541100/fetch-table-name-from-a-column-for-from-clause – Akshay