【问题标题】:Oracle multiple join query from same table, is displaying duplicate values来自同一个表的 Oracle 多连接查询,显示重复值
【发布时间】:2014-10-06 16:14:22
【问题描述】:

使用 Oracle 11g DB,我正在寻找一种方法来将一个表中的两行合并到我的查询结果中的一行中,但也允许在未输入数据的情况下使用 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

【问题讨论】:

  • 您的查询中没有其他联接吗?您确定ID 在各自的表中是唯一的吗?
  • 在我看来,您只想将数据转为类型...
  • ID1 在本例中相同,但 TYPE_A 和 TYPE_B 的数据不同。基本上我们有一个产品可以有两种类型的测试。测试在单独的行(A 和 B)上,我需要将它们“合并”成一行:产品、testA、testB。 LEFT JOIN 让我得到数据,但我得到重复的行,所以如果有 5 个 testA 和 6 个 testB,我似乎得到 30 行(每个 testB 一个 testA 行)

标签: sql oracle outer-join


【解决方案1】:

Pivot 会起作用吗?

注意 Pivot 仅在您知道所需的所有 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)
);

【讨论】:

  • 可以为 WHERE name = 'XYZ' 放入 WHERE 吗?
  • 我不明白为什么不这样做。根据我们希望施加限制的位置,它可能发生在两个不同的地方。在数据透视之前或之后。 if before 只需在 on 子句后添加 where 即可。如果在之后,则在 last ) 和 ; 之前添加 where 子句。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多