使用 Oracle 11g数据库,我正在寻找一种方法将一个表中的两行合并到我的查询结果中的一行中,但也允许在没有输入数据的情况下使用NULL值。
基本上我有类似的东西:
TABLE1包含对象标识
TABLE2包含两行对象数据(类型A和B)
我在想我需要运行一个OUTER JOIN,它只在获取对象数据类型A时有效,但是当我添加第二个JOIN时,我为B的每一行得到多条重复的A行。
因此,如果有4个A值和5个B值,我将看到每行B的5行A(总共20行)
SELECT T1.NAME, T2a.VALUE as TYPE_A, T2b.VALUE as TYPE_B
FROM TABLE1 T1
LEFT OUTER JOIN TABLE2 T2a ON (T1.ID = T2a.ID AND T2a.TYPE='A')
LEFT OUTER JOIN TABLE2 T2b ON (T1.ID = T2b.ID AND T2b.TYPE='B')
我想要得到这个(看看A有6个条目,B有5个):
NAME TYPE_A TYPE_B
ID1 VALUE1 VALUE2
ID1 VALUE1 VALUE2
ID1 VALUE1 (NULL)
ID1 VALUE1 VALUE2
ID1 (NULL) VALUE2
ID1 VALUE1 (NULL)
ID1 (NULL) VALUE2
ID1 VALUE1 (NULL)
非常感谢任何帮助。
KS
答案 0 :(得分:0)
Pivot会工作吗?
注意仅当您知道所需的所有Type值时,Pivot才有效。如果它不知道,那么你必须使用动态SQL ..
SELECT *
FROM
(
SELECT Name, Type, Value
FROM Table1 T1
INNER JOIN table2 T2
ON T1.ID = T2.ID
)
PIVOT
(
MAX(Value)
FOR (Type) IN ('A' AS TYPE_A,
'B' AS Type_B)
);
答案 1 :(得分:0)
PIVOT
应该在这里工作
SQL小提琴:http://www.sqlfiddle.com/#!4/46004f/2
SELECT *
FROM (SELECT T1.ID, T2.type, T2.value
FROM table1 T1
JOIN table2 T2
ON T1.ID = T2.ID)
PIVOT
( MAX(value) FOR type in ('A', 'B')
)