我的表结构是这样的:一张横表   CONTENT  字段如下:
 
           ID      NAME    AREA
          0      ‘A’    ‘NJ’
          1      ‘A’    ‘NJ’    一张纵表   CONTENTVISUAL 字段如下:          ID      FIELDNAME      FIELDVALUE
           0         F1              V1
           0         F2              V2
           0         F3              V3
           1         F1              V1
           1         F2              V2
           1         F3              V3
           要求查询出的结果:
             ID      NAME       AREA      F1      F2      F3  
            0       'A'        'NJ'      V1      V2      V3
            1       'B'        'NJ'      V1      V2      V3 
我原来是把纵表乘三次先变成横表,然后查,这样效率太低了,请达人们指点一个效率较高的查询语句,小弟先谢了!!

解决方案 »

  1.   

    纵表CONTENTVISUAL中列FIELDNAME的值已知的情况下,一下脚本实现最建单, SELECT
      ID, 
      NAME, 
      AREA,
      (SELECT B.FIELDVALUE FROM CONTENTVISUAL B WHERE B.ID=A.ID AND B.FIELDNAME='F1') F1,
      (SELECT B.FIELDVALUE FROM CONTENTVISUAL B WHERE B.ID=A.ID AND B.FIELDNAME='F2') F2,
      (SELECT B.FIELDVALUE FROM CONTENTVISUAL B WHERE B.ID=A.ID AND B.FIELDNAME='F3') F3
    FROM CONTENT A
      

  2.   

    数据量大的话,以下语句比较效率较高:SELECT 
      ID,
      NAME,
      AREA,
      MAX(DECODE(FIELDNAME, 'F1', FIELDVALUE, ''))  F1,
      MAX(DECODE(FIELDNAME, 'F2', FIELDVALUE, ''))  F2,
      MAX(DECODE(FIELDNAME, 'F3', FIELDVALUE, ''))  F3
    FROM
    (
      SELECT
        A.ID, 
        A.NAME, 
        A.AREA,
        B.FIELDNAME,
        B.FIELDVALUE
      FROM CONTENT A, CONTENTVISUAL B
      WHERE A.ID=B.ID(+)
    ) T
    GROUP BY ID, NAME, AREA
      

  3.   

    谢谢!我试了下,第二个语句效率好象比第一个高N倍,呵呵另还有一个疑问:如果我的横表一个ID一定会对应纵表里三条记录(F1,F2,F3),
    那么这句WHERE A.ID=B.ID(+)可以写成WHERE A.ID=B.ID吗??