举个例子吧
学生表:A(学生编号id,姓名name)
学生特长表:B(学生编号id,特长名称),特长名称取值为:音乐,美术,体育现在想建一个视图v(编号id,姓名name,音乐,美术,体育),其中音乐,美术,体育是一个布尔字段,标识这个学生有没有这个特长。创建这个视图的语句该怎么写呢?谢谢各位!

解决方案 »

  1.   

    CREATE OR REPLACE VIEW VIEW_NAME AS
    SELECT 
        A.学生编号id,A.姓名name, 
        DECODE(BB.特长名称, '音乐', '1', '0') AS 音乐,
        DECODE(BB.特长名称, '美术', '1', '0') AS 美术,
        DECODE(BB.特长名称, '体育', '1', '0') AS 体育
    FROM
        A, (SELECT 学生编号id, 特长名称 FROM B GROUP BY 学生编号id, 特长名称) BB
    WHERE 
        A.学生编号id = BB.学生编号id
    /
      

  2.   

    我感觉有点不妥,比如两张表:
    表A:                     表B:
    学生编号id  姓名name         学生编号id,特长名称
    10001       cld              10001       音乐
    10002       abc              10001       美术
                                 10002       体育而这条SQL 语句:(SELECT 学生编号id, 特长名称 FROM B GROUP BY 学生编号id, 特长名称);
    显示的结果就是上述表B显示的结构,因此按照上述PL/SQL语句,会造成如下结构:
    视图:C
    学生编号id  姓名name 音乐 美术 体育
    10001       cld      1    0    0
    10001       cld      0    1    0
    10002       abc      0    0    1因此不会符合题目的要求!
      

  3.   

    学生编号id  姓名name 音乐 美术 体育
    10001       cld      1    0    0
    10001       cld      0    1    0
    10002       abc      0    0    1
    对于这个结果你可以 再求和:
    CREATE OR REPLACE VIEW VIEW_NAME AS
    select SELECT A.学生编号id,A.姓名name, sum(音乐),sum(美术),sum(体育) from 
    (
        A.学生编号id,A.姓名name, 
        DECODE(BB.特长名称, '音乐', '1', '0') AS 音乐,
        DECODE(BB.特长名称, '美术', '1', '0') AS 美术,
        DECODE(BB.特长名称, '体育', '1', '0') AS 体育
    FROM
        A, (SELECT 学生编号id, 特长名称 FROM B GROUP BY 学生编号id, 特长名称) BB
    WHERE 
        A.学生编号id = BB.学生编号id
    )
    group by A.学生编号id,A.姓名name
    /