【发布时间】: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_AGROUP BY MAIN_ID, ENI在这个表中这是可行的,但我不能对其他表执行此操作,因为它可以从第 1 行获取列 a,从第 5 行获取列 b -
在一种情况下,公司看起来既可以是客户也可以是服务提供商。在其他情况下,main_id 和 type 都相同,除了公司名称中的额外字符。插入的业务规则是什么
-
我尝试使用 RANK 枚举所有重复项,但没有成功,如果我能做到这一点,我可以使用 where rank = 1 但不知道如何
-
你能分享一下预期的输出吗?
标签: oracle duplicates sql-insert