解决方案 »

  1.   

    那SQL该怎么写呢?因为现在要实现一个系统自定义字段功能,采用扩展属性表来实现,但是这样设计,我不知道该怎么把行数据转化为列,求大侠赐教,不胜感激!
      

  2.   

    假设要查询的table_id为p_id
    将下面语句的执行结果当作查询语句拿去执行SELECT 'select A.ProductID,MAX(AGE) AS AGE,'||
    WMSYS.WM_CONCAT('MAX(DECODE(B.FieldName,'''||NAME||''',C.Value)) AS '||NAME)
    ||' FROM Product A,ProductField B,Product_Field C
    WHERE A.ProductID=C.ProductID
    AND A.table_id =B.table_id
    AND B.ProductFieldID=C.ProductFieldID
    AND A.table_id='''||P_ID||'''
    GROUP BY A.ProductID'
    FROM ProductField 
    WHERE table_id=P_ID
      

  3.   

    版主你好,我按你发的SQL语句 把P_ID=ps_layer表ID了 然后执行下面的SQL语句
    SELECT 'select A.ProductID,MAX(AGE) AS AGE,'||
    WMSYS.WM_CONCAT('MAX(DECODE(B.FieldName,'''||NAME||''',C.Value)) AS '||NAME)
    ||' FROM Product A,ProductField B,Product_Field C
    WHERE A.ProductID=C.ProductID
    AND A.table_id =B.table_id
    AND B.ProductFieldID=C.ProductFieldID
    AND A.table_id='''||'ps_layer'||'''
    GROUP BY A.ProductID'
    FROM ProductField 
    WHERE table_id='ps_layer';
    报了NAME 标识符无效的错误,麻烦版主帮我看一下,还有就是这个P_ID我这样传对吗?
      

  4.   

    附上表结构 跟数据
    create table Product  
    (   
      ProductID   number,   
      age number,
      table_id  varchar2(20)
    )   
      
    create table ProductField   
    (   
      ProductFieldID   number,   
      FieldName    VARCHAR2(50),
      FieldType VARCHAR2(20),   
      table_id  varchar2(20)  

    create table Product_Field   
    (   
      ProductID       number,   
      ProductFieldID    VARCHAR2(50),
      Val  VARCHAR2(20)
    )   
    insert into Product (ProductID, age,table_id) values (1,28, 'ps_layer');   
       
    insert into ProductField (ProductFieldID, FieldName,FieldType,table_id) values (1,'Name','varchar2','ps_layer'); 
    insert into ProductField (ProductFieldID, FieldName,FieldType,table_id) values (2,'productType','varchar2','ps_layer');insert into Product_Field (ProductID , ProductFieldID,val) values (1,1, 'MP3');  
    insert into Product_Field (ProductID , ProductFieldID,val) values (1,2, '消费数码');  select * from Product;
    select * from ProductField;
    select * from Product_Field;
      

  5.   

    是我写错了,应该是FieldName,我写成name了
    SELECT 'select A.ProductID,MAX(AGE) AS AGE,'||
    WMSYS.WM_CONCAT('MAX(DECODE(B.FieldName,'''||FieldName||''',C.Value)) AS '||FieldName)
    ||' FROM Product A,ProductField B,Product_Field C
    WHERE A.ProductID=C.ProductID
    AND A.table_id =B.table_id
    AND B.ProductFieldID=C.ProductFieldID
    AND A.table_id='''||P_ID||'''
    GROUP BY A.ProductID'
    FROM ProductField 
    WHERE table_id=P_ID
      

  6.   

    版主,非常感谢你的回复 但是您提供的SQL语句执行效果是这样的现在,我已经找到类似的实现效果了
    方式一、
    SELECT t1.productid,
           t1.age,
           MAX(decode(t2.productfieldid, 1, t3.val, NULL)) name,
           MAX(decode(t2.productfieldid, 2, t3.val, NULL)) producttype
      FROM product       t1,
           productfield  t2,
           product_field t3
    WHERE t1.table_id = t2.table_id
           AND t2.productfieldid = t3.productfieldid
    GROUP BY t1.productid,
              t1.age;
              
              方式二、
    SELECT t1.productid,
           t1.age,
           (SELECT (SELECT t3.val FROM product_field t3 WHERE t3.productfieldid = t2.productfieldid)
              FROM productfield t2
             WHERE t2.table_id = t1.table_id
                   AND t2.productfieldid = 1) NAME,
           (SELECT (SELECT t3.val FROM product_field t3 WHERE t3.productfieldid = t2.productfieldid)
              FROM productfield t2
             WHERE t2.table_id = t1.table_id
                   AND t2.productfieldid = 2) producttype
      FROM product t1;
      
      
    方式三、
    SELECT *
      FROM (SELECT t1.productid,
                    t1.age,
                    t2.productfieldid,
                    t3.val
               FROM product       t1,
                    productfield  t2,
                    product_field t3
              WHERE t1.table_id = t2.table_id
                    AND t2.productfieldid = t3.productfieldid)
           -----
            pivot(MAX(val) --pivot_clause  
            FOR productfieldid --pivot_for_clause  
            IN(1 name, 2 producttype) --pivot_in_cluase  
            );  效果图:
      

  7.   

    我的语句执行结果是要执行的sql语句,把结果再拿去执行就是你最后要的效果了
      

  8.   

    按你8楼的写法需要预先知道要查询的table_id ,都有哪些字段,然后每换一个table_id都要重新写一次语句
    我提供的方法是每次通过sql语句拼接动态查询语句,然后把拼接的结果拿去执行,这种方式更灵活一些
      

  9.   


    感谢版主的耐心回复,可以了,是我搞错了,应该是把执行的sql语句结果,在执行就达到效果了
    再次非常感谢!