来自同一个表的Oracle多连接查询正在显示重复值

时间:2014-10-06 16:14:22

标签: sql oracle outer-join

使用 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

2 个答案:

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