2017-04-27 4 views
0

Voici ma table 'extension' qui a une référence à la table 'master'.oracle sql - optimize SELECT plusieurs lignes en tant que colonnes

MASTER_ID TEXT CATEGORY 
1   A1 AA 
1   A2 BB 
1   A3 CC 

je dois mettre ces catégories sous forme de colonnes dans ma requête de sélection, donc je suis venu avec ces requêtes:

SELECT MASTER_ID, 
(SELECT TEXT FROM EXTENSION WHERE CATEGORY = "AA") AS "AATEXT", 
(SELECT TEXT FROM EXTENSION WHERE CATEGORY = "BB") AS "BBTEXT", 
(SELECT TEXT FROM EXTENSION WHERE CATEGORY = "CC") AS "CCTEXT" 

FROM MASTER 
JOIN EXTENSION 
ON MASTER.ID = EXTENSION.MASTER_ID 

Résultat:

MASTER_ID CATEGORY_1 CATEGORY_2 CATEGORY_3 
1   AA   BB   CC 

Il fonctionne, mais la performance est un problème. Des idées comment il peut être optimisé?

Merci à l'avance

+0

Ajoutez des exemples de données de table et le résultat attendu - tout aussi bien formaté. – jarlh

+0

Je ne vois pas la table 'category' mentionnée n'importe où dans votre requête. Avez-vous une faute de frappe quelque part? –

+0

@TimBiegeleisen, désolé la table est appelée extension – lorraine

Répondre

-1
SELECT M.MASTER_ID, 
    CASE WHEN E.CATEGORY = 'AA' THEN E.TEXT END AS AATEXT, 
    CASE WHEN E.CATEGORY = 'BB' THEN E.TEXT END AS BBTEXT. 
    CASE WHEN E.CATEGORY = 'CC' THEN E.TEXT END AS CCTEXT 
    FROM MASTER M 
    INNER JOIN EXTENSION E 
    ON (M.MASTER.ID = E.EXTENSION.MASTER_ID) 

Vous pouvez utiliser cette requête

+0

Si vos valeurs sont dynamiques, pouvez-vous dire comment vous récupérez les enregistrements dynamiques –

+0

ce ne sont que des valeurs d'échantillon .. ceux-ci ne peuvent pas être codés en dur car ils sont dynamiques et nombreux .. – lorraine

+0

la valeur du champ de texte provient d'une entrée utilisateur sur l'application – lorraine

0

Vous pouvez utiliser l'instruction de pivot pour achive ceci:

SELECT * FROM EXTENSION 
PIVOT (max(CATEGORY) FOR TEXT 
    IN ('A1' AS Category_1, 'A2' AS Category_2, 'A3' AS Category_3)) 

L'exécution de la requête ci-dessus sur vos données résultats dans le sortie suivante:

MASTER_ID | CATEGORY_1 | CATEGORY_2 | CATEGORY_3 
1   | AA   | BB   | CC 

Cela pourrait fonctionner mieux que votre requête.