表A.
ID NAME
1 CardID,CardName
2 ClassID,ClassName
3 ADDRESS
4 TEL表B
ID CardID,ClassID,ClassName, ADDRESS, TEL, HomePhone ,pictureID
H 11 12 e aaa 3221234 888888888 11
G 12 13 y bbb 3221234 888888888 11建视图后结果C:ID CardID,ClassID,ADDRESS, TEL,
H 11 12 aaa 3221234
G 12 13 bbb 3221234 说明:
当表A中的NAME中为两个字符串时,取第一个与表B关联,只显示表B中,在A.NAME中的字段.请用oracle语句建视图,由于数据量大,要考虑速度.哪位大侠告诉我,谢谢
ID NAME
1 CardID,CardName
2 ClassID,ClassName
3 ADDRESS
4 TEL表B
ID CardID,ClassID,ClassName, ADDRESS, TEL, HomePhone ,pictureID
H 11 12 e aaa 3221234 888888888 11
G 12 13 y bbb 3221234 888888888 11建视图后结果C:ID CardID,ClassID,ADDRESS, TEL,
H 11 12 aaa 3221234
G 12 13 bbb 3221234 说明:
当表A中的NAME中为两个字符串时,取第一个与表B关联,只显示表B中,在A.NAME中的字段.请用oracle语句建视图,由于数据量大,要考虑速度.哪位大侠告诉我,谢谢
还有一点的是关联字段是哪个字段?你给的表结构好象无法找到关联?
先取第一张表的name字段,如果有逗号,则取逗号之前的。所以可以取到
CardID
ClassID
ADDRESS
TEL
再用这四个字段,取B表中的这四列值。
--试一下:
WITH a AS (SELECT id FROM tableA where instr(a.name,'cardid') or instr(a.name,'classid')),
b AS (select rownum rn,ID,CardID,ClassID,ADDRESS,TEL from tableB order by id)
SELECT b.ID,b.CardID,b.ClassID,b.ADDRESS,b.TEL
FROM a, b
WHERE a.id = b.rn
ORDER BY b.id;
SQL> create table A (id int,name varchar2(100));Table createdSQL> create table B (ID char(2),CardID int,ClassID int,ClassName char,ADDRESS varchar2(20),TEL varchar2(20),HomePhone varchar2(20),pictureID int);Table createdSQL> select * from A; ID NAME
---------- ----------------
1 CardID,CardName
2 ClassID,ClassName
3 ADDRESS
4 TELSQL> select * from b;ID CARDID CLASSID CLASSNAME ADDRESS TEL HOMEPHONE PICTUREID
-- ----------- ----------- ------------ ----------- ----------- ----------- ---------
H 11 12 e aaa 3221234 888888888 11
G 12 13 y bbb 3221234 888888888 11
SQL> create or replace procedure t_proc(out_var out sys_refcursor) as
2 select_column varchar2(100);
3 v_sql varchar2(400);
4 begin
5 SELECT wmsys.wm_concat(decode(instr(name, ',') - 1,
6 -1,
7 name,
8 substr(name, 1, instr(name, ',') - 1)))
9 into select_column
10 FROM A;
11 v_sql := 'select id ' || select_column || ' from B';
12 open out_var for v_sql;
13 commit;
14 end;
15 /过程已创建。SQL> var v_out refcursor库 --以下用于测试
SQL> begin
2 t_proc(:v_out);
3 end;
4 /PL/SQL 过程已成功完成。
SQL> print :v_out; --显示测试结果ID CARDID CLASSID ADDRESS TEL
-- ---------- ---------- -------------------- --------------------
H 11 12 aaa 3221234
G 12 13 bbb 3221234SQL>
用过程不复杂,就是感觉用VIEW很困难,没想出来。
ID NAME
1 CardID
2 ClassID
3 ADDRESS
4 TEL 表B
ID CardID,ClassID,ClassName, ADDRESS, TEL, HomePhone ,pictureID
H 11 12 e aaa 3221234 888888888 11
G 12 13 y bbb 3221234 888888888 11 建视图后结果C: ID CardID,ClassID,ADDRESS, TEL,
H 11 12 aaa 3221234
G 12 13 bbb 3221234
表A.Name怎么取第一个字段,我已经会了,所以把A.Name简化了;表A的数据可能会增加,但曾加的值肯定是在表B中的字段名;
我要的结果是:显示表B中字段名在A.NAME(这个列的)出现的记录.如果实在不能用视图,存储过程也可以,谢谢!
代码都摆在楼上了,你也不仔细看一看
过程返回结果集是要用ref cursor的.
我看过了,谢谢你,我还是想要视图的,因为我现在用的框架显示用过程展示数据很烦忙,你写的过程我还得学习一下.