【问题标题】:Oracle 11g insert into select from a table with duplicate rowsOracle 11g 从具有重复行的表中插入选择
【发布时间】:2020-10-18 09:45:06
【问题描述】:

我有一张桌子需要拆分成其他几张桌子。 但是主表就像一个传递表。 我将数据从 excel 转储到其中(从 5k 到 200k 行),并使用 insert into select,拆分为正确的表(五个不同的表)。 但是,我的客户发送的最新数据集包含重复值的记录。

我的表的主键通常是 ENI。但即使是这个记录也是重复的,因为同一家公司可以是客户和服务提供商,所以他们有两个不同的寄存器但使用相同的 ENI。

到目前为止我所拥有的。 我找到了一个使用合并的脚本并对其进行了修改以找到相同的 eni 并将相同的 main_id 更新为所有

|Main_id|   ENI     |   company_name|   Type
|   1   |   1864    |   JOHN        |   C
|   2   |   351485  |   JOEL        |   C
|   3   |   16546   |   MICHEL      |   C
|   2   |   351485  |   JOEL J.     |   S
|   1   |   1864    |   JOHN E. E.  |   C

Main_id: Primarykey that the main BD uses
ENI: Unique company number
Type: 'C' - COSTUMER 'S' - SERVICE PROVIDERR

某些情况下它可以具有相同的类型。就像 id 1 还有其他几个列...

我需要什么: 插入我的其他脚本已经排序的任何 main_id,并在其他脚本上设置一个未插入的标志。我无法删除任何需要将这些信息发送给客户验证的数据。

或者我只是无法做到这一点并回到好的旧excel

编辑:作为下面的问题,这是一个示例

|Main_id|   ENI     |   company_name|   Type|   RANK|
|   1   |   1864    |   JOHN        |   C   |   1   |
|   2   |   351485  |   JOEL        |   C   |   1   |
|   3   |   16546   |   MICHEL      |   C   |   1   |
|   2   |   351485  |   JOEL J.     |   S   |   2   |
|   1   |   1864    |   JOHN E. E.  |   C   |   2   |

    RANK -  would be like the 1864 appears 2 times,
1st one found gets 1 second 2 and so on. i tryed using
    RANK() OVER (PARTITION BY MAIN_ID ORDER BY ENI)
    RANK() OVER (PARTITION BY company_name ORDER BY ENI)

感谢 TEJASH,我能够想出这个解决方案

MERGE INTO TABLEA S
    USING (Select ROWID AS ID,
        row_number() Over(partition by eniorder by eni, type) as RANK_DUPLICATED
        From TABLEA
    ) T
    ON (S.ROWID = T.ID)
    WHEN MATCHED THEN UPDATE SET S.RANK_DUPLICATED= T.RANK_DUPLICATED;

【问题讨论】:

  • 您是批量插入还是逐个插入。你可以做插入;然后用左连接选择,查找因源中存在但目标中不存在而未插入的记录
  • INSERT INTO TABLE_B (MAIN_ID, ENI, COMPANY_NAME) SELECT MAIN_ID, ENI, MAX(COMPANY_NAME) FROM TABLE_A GROUP BY MAIN_ID, ENI 在这个表中这是可行的,但我不能对其他表执行此操作,因为它可以从第 1 行获取列 a,从第 5 行获取列 b
  • 在一种情况下,公司看起来既可以是客户也可以是服务提供商。在其他情况下,main_id 和 type 都相同,除了公司名称中的额外字符。插入的业务规则是什么
  • 我尝试使用 RANK 枚举所有重复项,但没有成功,如果我能做到这一点,我可以使用 where rank = 1 但不知道如何
  • 你能分享一下预期的输出吗?

标签: oracle duplicates sql-insert


【解决方案1】:

据我了解您的问题,您只需要知道基于 2 列的重复项。您可以使用解析函数来实现它,如下所示:

Select t.*, 
       row_number() Over(partition by main_id, eni order by company_name) as rnk
  From your_table t

【讨论】:

  • 是的,解决了它。我知道 ROWNUM,但不知道这个 row_number()。
猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 2017-12-07
  • 2013-12-01
  • 2014-01-06
  • 1970-01-01
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
相关资源
最近更新 更多