这个问题困扰了我好久了,希望高手帮忙看下,多谢先!Oracle 9I:需要从2张表生成一个视图。
要求根据表A中的FLAG确定,如果FLAG=T,那么就从表B中找到相应的YEAR;如果FLAG=F,那就没有表B的事,直接填入NULL就行。表结构如下:table A
ID   NAME    FLAG
1     LI       T
2     WANG     F
3     TU       FTABLE B
ID     YEAR
1       2008
2       2007
3       2007
4    2006
5    2005要求生成的视图如下:
VIEW C
ID   NAME    YEAR
1     LI       2008
2     WANG     NULL
3     TU       NULL

解决方案 »

  1.   

    create view c
    as
    select a.ID,a. NAME , case when a.FLAG='T' then b.YEAR else null end year
    from a,b
    where a.id=b.id
      

  2.   

    我的思路是:CREATE VIEW C
    AS SELECT 
    ID,NAME,YEAR
    FROM A,B
    WHERE
    (A.FLAG='T' AND A.ID=B.ID)
    OR
    (A.FLAG='F');  //这里面就不会写了!!!求助下!!
      

  3.   

    sasacat,我改了下,刚才有个地方条件不够。如果A中的有些ID在B中就不存在呢?table   A 
    ID       NAME         FLAG 
    1           LI               T 
    2           WANG           F 
    3           TU               F TABLE   B 
    ID           YEAR 
    1               2008 
    2               2007 
    3               2007 
    4    2006 
    5    2005 要求生成的视图如下: 
    VIEW C 
    ID       NAME         YEAR 
    1           LI               2008 
              WANG           NULL 
    8           TU               NULL 
      

  4.   

    create   view   c 
    as 
    select   a.ID,a.   NAME   ,   case   when   a.FLAG='T'   then   b.YEAR   else   null   end   year 
    from   a,b 
    where   a.id=b.id (+)
      

  5.   

    sasacat,非常感谢,这个问题已经是完美解决了,我明天会记得送分给你。
      

  6.   

    哈,系统不允许!说是一天后才可以加分。
    麻烦你帮我再看下以下的代码哦。我会再加20分的。多谢了这样就有问题了,A.KEY='F'的在VIEW里看不到了。外连接就有问题了。CREATE VIEW TESTVIEW(EVENTID,KEY,STREAMID,NODEID,ACKUSER,D_NAME)
    AS SELECT 
    A.EVENTID,A.KEY,A.STREAMID,A.NODEID,A.ACKUSER,
    CASE WHEN A.KEY='T' THEN D.NAME ELSE NULL END D_NAME
    FROM EVENTS A, 
    STREAM_LOG C,
    NODES D
    WHERE 
    A.ACKUSER IS NULL AND
    A.NODEID = D.NODEID (+) AND 
    A.STREAMID = C.STREAMID (+)AND
    D.STREAMVERSIONID = C.CURRENTSTREAMVERSIONID // 这个加了(+)后会报错。
    ;
      

  7.   

    要不你就在子查询里先做C,D表的外连接,然后再跟A表做外连接
      

  8.   

    由A表中的STREAMID到C表中查询到CURRENTSTREAMVERSIONID,再根据A表中的NODEID和刚才查到的CURRENTSTREAMVERSIONID到D表中查询D_NAME。
      

  9.   

    SELECT a.eventid, a.KEY, a.streamid, a.nodeid, a.ackuser,
           CASE
              WHEN a.KEY = 'T'
                 THEN e.NAME
              ELSE NULL
           END e_name
      FROM EVENTS a,
           (SELECT c.streamid, d.nodeid, d.NAME
              FROM stream_log c, nodes d
             WHERE d.streamversionid = c.currentstreamversionid(+)) e
     WHERE a.ackuser IS NULL 
    AND a.nodeid = e.nodeid(+) 
    AND a.streamid = e.streamid(+)
      

  10.   

    sasacat,很抱歉,在几天在外出差没能及时加分。分数我已经加到100分了,等我先试下再确实结贴加分。多谢啦。