表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语句建视图,由于数据量大,要考虑速度.哪位大侠告诉我,谢谢

解决方案 »

  1.   

    这个要考虑的是A表的name为两个字符串的是不是都是以逗号分开的,如果以逗号分开,那么只要判断name里面有逗号的就与B表关系
    还有一点的是关联字段是哪个字段?你给的表结构好象无法找到关联?
      

  2.   

    比较复杂,得用动态SQL,写过程实现吧
      

  3.   

    我理解
    先取第一张表的name字段,如果有逗号,则取逗号之前的。所以可以取到
    CardID
    ClassID
     ADDRESS 
    TEL 
    再用这四个字段,取B表中的这四列值。
      

  4.   

    to linzhangs:我现在也明白了。分析函数比较难写,还是使用存贮过程吧!
      

  5.   


    --试一下:
    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;
      

  6.   

    lz的需求应该是动态字段取值.即根据A表的数据即决定取哪几列值.
      

  7.   

    -- 用过程实现
    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>
      

  8.   

    我上面的程序是假设你A表中的值都是能对应上你B表字段的.如果A表中可能存在非字段的值,则需要先与user_tab_cols表关联判断,
    用过程不复杂,就是感觉用VIEW很困难,没想出来。
      

  9.   

    谢谢大家的回复,可能有些地方我没有说清楚.表A. 
    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(这个列的)出现的记录.如果实在不能用视图,存储过程也可以,谢谢!
      

  10.   

    真是无语...
    代码都摆在楼上了,你也不仔细看一看
    过程返回结果集是要用ref cursor的.
      

  11.   

    TO:sleepzzzzz
    我看过了,谢谢你,我还是想要视图的,因为我现在用的框架显示用过程展示数据很烦忙,你写的过程我还得学习一下.
      

  12.   

    只是用动态SQL才能解决的问题,不是用一个SQL(视图也就是存储SQL代码的一个ORACLE"对象")就可以解决的。