【问题标题】:Left Outer Join returns duplicate records - Oracle左外连接返回重复记录 - Oracle
【发布时间】:2018-05-23 07:28:41
【问题描述】:

场景:

将表 ORDER 与表 COST 连接起来 其中 COST 有多个行用于表 ORDER 中的单个引用

期望的结果:

返回每个订单的单行及其相关成本。

ID NAME PRICE GST
1  Book 100   10
2  CD   50    5

例如:

表顺序

ID   NAME  COST
1    Book  110
2    CD    55

餐桌费用

ID ORDER_ID COST_TYPE VALUE
1   1   PRICE      100
2   1   GST        10
3   2   PRICE      50
4   2   GST        5

使用以下条件时,LEFT OUTER JOIN 返回多行

SELECT * from ORDER
LEFT OUTER JOIN COST
ON ORDER.ID = COST.ORDER_ID

【问题讨论】:

  • 那么您希望它返回什么并显示输出?
  • 你希望它返回什么?目前您正在从两个表中选择所有记录,我什至不确定这是否有效,因为我认为您需要指定要从哪个表中选择列。
  • 啊!你们太快了:)我实际上找到了解决方案,想提出一个问题,以便可以帮助其他人。
  • 更具体地说:“相关成本”是什么意思?在第二个表中,您有 PRICEGST 的值(无论这意味着什么)。这些与相关成本有什么关系(如果有的话)?
  • 编辑OK...您使用什么版本的Oracle? Oracle 11.1 及更高版本具有PIVOT 运算符;对于早期版本,您需要使用条件聚合。

标签: oracle duplicates left-join


【解决方案1】:
select o.id, o.name, c.price, c.gst
from   order o left outer join
       ( select   order_id, 
                  sum(case when cost_type = 'PRICE' then value end) as price,
                  sum(case when cost_type = 'GST'   then value end) as gst
         from     cost
         group by order_id
       ) c
       on o.id = c.order_id
;

【讨论】:

  • 是的,这样更有效率。干杯!
【解决方案2】:

所以Select ORDER.ID, COST.COST_TYPE, COST.VALUE from ORDERS LEFT OUTER JOIN COST ON ORDER.ID = COST.ORDER_ID and COST.COST_TYPE = 'PRICE'

如果您不指定 COST_TYPE,那么它将返回多行,因为 ORDER_ID 在您的 COST TABLE 上重复。

【讨论】:

  • 你确定 PRICE 和 COST 是一回事吗?
【解决方案3】:

这就是我在我的案例中发现的。

必须使用 2 个 LEFT OUTER JOIN 和别名才能使其正常工作

SELECT ID, NAME, PRICE.value as PRICE, GST.value as GST 
from ORDER

LEFT OUTER JOIN COST as PRICE
ON ORDER.ID = COST.ORDER_ID
AND PRICE.COST_TYPE = 'PRICE'

LEFT OUTER JOIN COST as GST
ON ORDER.ID = COST.ORDER_ID
AND GST.COST_TYPE = 'GST'

【讨论】:

  • 所以我提供的解决方案不起作用?或者你甚至没有尝试过?作为记录 - 您找到的解决方案是正确的,但效率低下。它执行两个连接而不是一个,这也意味着它必须对第二个表执行两次而不是一次完整扫描。
猜你喜欢
  • 1970-01-01
  • 2013-04-03
  • 2023-03-07
  • 1970-01-01
  • 2019-07-14
  • 1970-01-01
  • 2011-07-11
  • 1970-01-01
  • 2021-01-20
相关资源
最近更新 更多