2017-04-27 150 views
0

这里是我的表'扩展',它有'主'表的引用。oracle sql - 优化SELECT多行为列

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

我需要把这些类别为列在我的选择查询,所以我想出这些查询:

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 

结果:

MASTER_ID CATEGORY_1 CATEGORY_2 CATEGORY_3 
1   AA   BB   CC 

它的工作原理,但性能一个问题。任何想法如何优化?

在此先感谢

+0

添加一些示例表格数据和预期结果 - 所有以及格式化文本。 – jarlh

+0

我没有看到在你的查询中提到的任何地方的'category'表。你在某个地方有错字吗? –

+0

@TimBiegeleisen,对不起,表被称为扩展 – lorraine

回答

-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) 

您可以使用此查询

+0

如果你的值是动态的,你能告诉你如何获取动态记录 –

+0

这些只是样本值..这些不能被硬编码,因为这些是动态的和许多.. – lorraine

+0

文本字段值是来自应用程序上的用户输入 – lorraine

0

可以使用旋转语句来实现这一目标:

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

执行上的数据结果上面的查询以下输出:

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

这可能比您的查询执行得更好。