2015-04-07 58 views
0

我遇到了一個問題,我不知道如何解決它。將查詢nxn的結果轉換爲列 - ORACLE

我有以下結構:

  • 表PIECE
  • 表PIECE_CHARACTHERISTIC
  • 表特徵

表PIECE_CHARACTHERISTIC使得PIECE和特性之間的關係的N×N。

所以,一件可以有很多特點。 我需要一些characteristcs的,並顯示他們在查詢結果列:

SELECT PC.CHARACTERISTIC_ID, PC.CHAR_VALUE FROM PIECE P 
INNER JOIN PIECE_CHARACTHERISTIC PC ON P.PIECE_ID = PC.PIECE_ID 
WHERE 
    PC.CHARACTERISTIC_ID = 1 OR 
    PC.CHARACTERISTIC_ID = 2 OR 
    PC.CHARACTERISTIC_ID = 3; 

由於此查詢的結果,我有這樣的事情:

PIECE  CHARACTERISTIC_ID CHAR_VALUE 
    P1    1    A 
    P1    2    B 
    P1    3    C 
    P2    1    D 
    P2    2    E 
    P3    1    X 
    ... 

我想結果是這樣的:

PIECE  CHAR_1  CHAR_2 CHAR_3 
P1   A   B  C 
P2   D   E  NULL 
P3   X   NULL  NULL 

恢復,我想轉換一列的特徵在許多列的結果與每個characteristi的值c爲這件作品。 非常感謝您的幫助!

回答

0

這應該工作,你只需要添加左加入的特性

SELECT 
    P.PIECE_ID, 
    PC1.CHAR_VALUE AS CHAR_1, 
    PC2.CHAR_VALUE AS CHAR_2, 
    PC3.CHAR_VALUE AS CHAR_3 
FROM PIECE P 
LEFT JOIN PIECE_CHARACTHERISTIC PC1 
ON PC1.PIECE_ID = P.PIECE_ID AND PC1.CHARACTERISTIC_ID = 1 
LEFT JOIN PIECE_CHARACTHERISTIC PC2 
ON PC2.PIECE_ID = P.PIECE_ID AND PC1.CHARACTERISTIC_ID = 2 
LEFT JOIN PIECE_CHARACTHERISTIC PC3 
ON PC3.PIECE_ID = P.PIECE_ID AND PC1.CHARACTERISTIC_ID = 3 
0

你可以試試這個的每一列。這有點醜,但應該工作。

with 
A as ( 
    select PIECE, listagg(CHAR_VALUE,'|') within group (order by CHAR_VALUE) TXT 
    from 
     PIECE P, PIECE_CHARACTHERISTIC PC 
    where  
     P.PIECE_ID = PC.PIECE_ID 
    group by PIECE 
) 
select 
    A.PIECE, 
    substr(A.TXT, 1, 1) CHAR_1, 
    substr(A.TXT, 3, 1) CHAR_2, 
    substr(A.TXT, 5, 1) CHAR_3 
from A