Oracle PL/SQL Rotate/Pivot Query

Alias Query a campi incrociati in Oracle.

Supponiamo di avere due tabelle:

Master Table
Column Type Description
ID INT Unique identity column
name VARCHAR2(100) name of object of interest.   

Detail Table
Column Type Description
ID INT Unique identity column
name VARCHAR2(100) name of property.   
val VARCHAR2(100) value of property.   

Una tradizionale query tra queste due tabelle

SELECT M.ID
       
M.name
       
D.name AS property
       
D.val AS propValue
  
FROM Master M  
       
JOIN Detail D 
       
ON D.ID M.ID

darebbe il seguente risultato

  ID    name          property    propValue
  ----  ------------  ----------  -----------
  1     Thing1        bit1        xxxx
  1     Thing1        bit2        yyyy
  2     Thing2        bit1        aaaa
  3     Thing2        bit2        bbbb

Potrebbe capitare che sia più utile avere il seguente risultato

  ID    name          bit1        bit2
  ----  ------------  ----------  -----------
  1     Thing1        xxxx        yyyy
  2     Thing2        aaaa        bbbb

La cui relativa query sql è la seguente:

SELECT M.idM.name,
       (
SELECT D.val FROM XDetail D
         
WHERE D.id M.id AND D.name 'xxxx'AS "xxxx",
       (
SELECT D.val FROM XDetail D
         
WHERE D.id M.id AND D.name 'yyyy'AS "yyyy"
  
FROM XMaster M
 
WHERE M.id 1

 

Tuttavia potrebbe essere più utile implementare un meccanismo per la generazione di tali query, eccone un esempio per la query precedente.

 

DECLARE
  
p_id number :1;
  
sqls varchar(1000);
  
cols varchar(1000:'';

  
CURSOR cur IS
   SELECT 
D.idD.nameD.val
     
FROM XDetail D
    
WHERE D.id p_id;

BEGIN
  FOR 
rec IN cur LOOP
    IF 
(LENGTH(cols) > 0THEN
      
cols :cols || ',';
    
END IF;

    
cols :cols
      
|| '(SELECT D.val FROM XDetail D »»
            WHERE D.id = M.id AND D.name = '''
      
|| rec.name
      
|| ''') AS "'
      
|| rec.name
      
|| '"';

  
END LOOP;

  
sqls :'SELECT M.id, M.name, '
    
|| cols
    
|| ' FROM XMaster M WHERE M.id = '
    
|| p_id;

  
EXECUTE IMMEDIATE sqls;

END;

 

Fonte: http://weblogs.asp.net/stevencohn/archive/2005/01/28/362373.aspx

 

Fletto i muscoli e sono nel vuoto.

powered by IMHO 

Print | posted on lunedì 6 giugno 2005 01:01

Comments on this post

# Oracle PL/SQL Rotate/Pivot Query

Requesting Gravatar...
Left by Beyond the Good and Evil on giu 05, 2005 11:04

# Oracle/PLSQL Rotate/Pivot Query

Requesting Gravatar...
Left by Beyond the Good and Evil on giu 30, 2005 7:51
Comments have been closed on this topic.