现在又如下两个表
表a 表b
--------------------- ----------------------------
a1 a2 b1
a3 a4 b2如果想通过view做出以下的效果
------------------------------
a1 b1 b2 a2
a3 b1 b2 a4如果表b中有3条数据就是一下的效果
------------------------------
a1 b1 b2 b3 a2
a3 b1 b2 b3 a4也不知道看明白没~就是b表中多少条数据view的表就对应多少列~~~关键中怎么合并成一条数据不会做~~~希望大家帮我出谋划策~~~~谢谢大家
表a 表b
--------------------- ----------------------------
a1 a2 b1
a3 a4 b2如果想通过view做出以下的效果
------------------------------
a1 b1 b2 a2
a3 b1 b2 a4如果表b中有3条数据就是一下的效果
------------------------------
a1 b1 b2 b3 a2
a3 b1 b2 b3 a4也不知道看明白没~就是b表中多少条数据view的表就对应多少列~~~关键中怎么合并成一条数据不会做~~~希望大家帮我出谋划策~~~~谢谢大家
楼主你的需求中,列的显示是动态的,一个可行的思路就是使用动态sql,而构建动态sql的方式就是遍历b表,这恐怕很难在一个select语句中实现。
create or replace procedure proc authid current_user is
strsql varchar2(2000);
strsql2 varchar2(4000) default '';
begin
for cur1 in (select * from a) loop
strsql:='';
for cur2 in (select * from b) loop
strsql := strsql || ' ''' ||cur2.bb1 || ''' ' || cur2.bb1 || ', ';
end loop;
strsql:='union all select '''||cur1.aa1||''''||cur1.aa1||','||strsql||''''||cur1.aa2||''' '||cur1.aa2||' from dual ';
strsql2:=strsql2||strsql;
end loop;
/* strsql:=substr(strsql,11);
dbms_output.put_line(substr(strsql2, 11));*/
execute immediate 'create or replace view myv as '||substr(strsql2, 11);
end proc;最后得到的视图myv就是你要的答案。
select 'a1' a1, 'b1' b1, 'b2' b2, 'b3' b3, 'a2' a2
from dual
union all
select 'a3' a3, 'b1' b1, 'b2' b2, 'b3' b3, 'a4' a4 from dual
。
这是过程里面用了俩个循环,来拼接sql语句。最后在用
execute immediate 'create or replace view myv as '||substr(strsql2, 11); 生成视图。
還是不行~~~view裏面沒有myv這個view 我隨便寫了一個可以生成出來~~~~而且給的代碼~也沒有報錯誤~挺實困惑~~需求就是兩個表交叉出一個明細表
execute immediate 'create or replace view MyView
as
select *
from T_ROLEAPPLYTERMSMST C';
end proc;我已經簡化成這樣了~還是沒有 MyView這個 刷新也不可以
begin
proc;
end;
放在pl/sql develop 执行一下;
或是在SQLPlus里 执行exec proc; 在查看有没有视图;
最後有客戶決定~該到java里來處理~~~~~崩潰~~~
討論對操作的的人不會給更新視圖的權限~~~哈哈~在此揭帖了~