【问题标题】:Getting duplicate records in Oracle在Oracle中获取重复记录
【发布时间】:2020-01-20 06:19:54
【问题描述】:

我有 3 张桌子:order、order_transaction 和 order_history。

在order 中,仅保存一个订单条目以及order_id。 在order_history 中,我保存了该订单上发生的所有事务,例如orderAccepted、orderInProgress(这是该订单上的事件)。 在order_transaction 中保存了所有与交易相关的详细信息。两个表中的transaction_id 即order_transaction 和order_history 保持不变。

content of tables are 
order
    id
    created by
    created_date
    client type
    type 
    qty 
    price

order_history
    id
    order_id
    transaction_id
    events
    created_date

order_transaction
    id
    order_id
    transaction_id
    qty
    price
    status

有一个事件,客户可以恢复名为orderProccessedReverted 的订单,但这不是一次性完成的。例如,如果有一个 1000 数量的订单,然后它被还原,它将被分成 10 个不同的条目,其中 order_id 将保持不变,但交易将发生变化,并且此条目将同时出现在 order_transaction 和 order_history表格。

两个表中的条目示例如下:

order_history
id  order_id  transaction_id  events                        created_date  
001  1111       345           orderProccessedReverted       20-08-19
002  1111       346           orderProccessedReverted       20-08-19
003  1111       347           orderProccessedReverted       20-08-19


order_transaction
id  order_id  transaction_id    qty     created_date  
011  1111       345             100      20-08-19
012  1111       346             100      20-08-19
013  1111       347             100      20-08-19

现在我正在生成一份报告,我需要在其中恢复所有订单。以下是报告栏:

order_id   created_by   client_type  transaction_id   qty    status          events                     created_date
111         user1           type1       444           100    reverted       orderProccessedReverted         20-08-19
111         user1           type1       445           100    reverted       orderProccessedReverted         20-08-19
111         user1           type1       446           100    reverted       orderProccessedReverted         20-08-19
111         user1           type1       447           100    reverted       orderProccessedReverted         20-08-19
112         user2           type2       551           50     reverted       orderProccessedReverted         20-08-19
112         user2           type2       552           50     reverted       orderProccessedReverted         20-08-19
112         user2           type2       553           50     reverted       orderProccessedReverted         20-08-19

我尝试了左连接和普通连接,但我得到了重复的记录。

我尝试了以下查询:

select * from
order_history orderHist,
order_transaction  tr,
order ord
where
ord.id = tr.order_id
AND  tr.order_id = orderhist.order_id
AND tr.transaction_id = orderhist.transaction_id 
AND orderhist.event= 'orderProccessedReverted'
AND tr.status = 'REVERTED'
AND ord.tradedate='20190820';

【问题讨论】:

  • 您应该更喜欢 ANSI 连接语法,而不是旧的 Oracle 连接语法。它甚至在古代 Oracle 10g 中就已经可用
  • @Wernfried Domscheit 我也试过 JOIN 和 LEFT JOIN。
  • @Suyash:您没有显示表“订单”的示例数据,您可以添加它吗?另外,根据您的示例数据,您能否显示您期望的输出?
  • @Suyash 提供预期的报告输出,以及 ord 表中将有多少条目。您提供的查询将给出重复记录,因为 order_history 和 order_transaction 中有多个条目。
  • 您的示例数据与您的表结构不匹配(order_transaction 在示例数据中有created_date 但不在列列表中,并且没有qty、price 或@987654347 @ 在您的示例数据中)并且都不匹配您的查询(ord.tradedate 不存在并且orderhist.event 缺少s)。请edit您的问题,为您的表提供有效的 DDL 语句,为您的示例数据提供 DML 语句以及将针对它们运行的​​ SQL 查询给我们一个minimal reproducible example(并包括您的预期输出)。

标签: sql oracle join oracle10g


【解决方案1】:

试试这个,我用虚拟数据和几列创建,你可以在选择中添加更多列。

WITH ord AS ( SELECT '001' AS id,
       '111' AS order_id
FROM dual ), ord_his AS ( ( SELECT '001' AS id,
       '111' AS order_id,
       '456' AS transaction_id,
       'Reverted' AS events
FROM dual
) UNION ( SELECT '002' AS id,
       '111' AS order_id,
       '457' AS transaction_id,
       'Reverted' AS events
FROM dual
) ), ord_tran AS ( ( SELECT '001' AS id,
       '111' AS order_id,
       '456' AS transaction_id,
       100 AS qnty
FROM dual
) UNION ( SELECT '002' AS id,
       '111' AS order_id,
       '457' AS transaction_id,
       100 AS qnty
FROM dual
) ) SELECT ord.*,
       ord_his.transaction_id,
       events,
       qnty
FROM ord,
     ord_his,
     ord_tran
WHERE ord.order_id = ord_his.order_id AND ord_his.transaction_id = ord_tran.transaction_id;

【讨论】:

  • 仍然给出重复。
  • 提供你正在使用的数据
猜你喜欢
  • 1970-01-01
  • 2019-03-20
  • 1970-01-01
  • 2018-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多