2014-10-06 111 views
0

使用一个Oracle 11g DB,我正在寻找一种方法来将我的查询结果中的两行从一个表合并到一行中,但也允许NULL值数据尚未输入。来自同一个表的Oracle多重连接查询显示重复值

基本上我有这样的:

TABLE1包含对象识别

TABLE2包含对象数据的两行(A型& B)

我想我需要运行外JOIN,它只在获取对象数据类型A时工作,但当我添加第二个JOIN时,我为B的每一行获得多个A的重复行。

因此,如果有4个A值和5个B值,我会的拭目以待5行A对B的每一行(共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

你没有在查询任何其他加盟?你确定'ID'在它们各自的表中是唯一的吗? – 2014-10-06 16:37:04

+1

对我来说,你只是想旋转类型的数据...... – xQbert 2014-10-06 16:51:14

+0

ID1在这个例子中是相同的,TYPE_A和TYPE_B的数据是不同的。基本上我们有一种产品可以有两种类型的测试。测试是在单独的行(A和B)上,我需要将它们合并为一行:product,testA,testB。如果有5个testA和6个testB,我似乎会得到30行(每个testB有一个testA行) – Casper 2014-10-07 15:33:20

回答

0

转轴是否可以工作?

注意仅当您知道所需的所有Type值时才能使用透视。如果它不知道,那么你必须使用动态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) 
); 
+0

可以将一个WHERE放在这里用于WHERE name =' XYZ“? – Casper 2014-10-07 15:58:49

+0

我不明白为什么不。它可能发生在两个不同的地方,取决于我们想要限制的地方。数据旋转之前或之后。如果之前只需在on子句之后添加。如果在之后,在最后加上where子句)和之前;。 – xQbert 2014-10-07 16:46:02

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