【发布时间】:2019-04-03 18:31:07
【问题描述】:
因此,我目前遇到一个问题,即在尝试从物化视图插入表时,我遇到了基于 复合键 的重复项。 复合键由三列组成:TIMESTAMP、NAME 和 TYPE。我尝试使用以下方法,但仍然遇到相同的问题(我收到重复的错误消息并且存储过程停止运行)。有没有办法处理异常,以便它跳过重复的行?如果不是我想到了下面的 DELETE 语句来消除重复项,这是正确的方法吗?
以下是我正在使用的“批量插入”语句:
DELETE FROM table
where timestamp IN (SELECT DISTINCT ts from mv_1)
and person IN (SELECT distinct name from mv_1)
and TYPE IN (SELECT distinct data_type from mv_1);
commit;
--
DELETE FROM table
WHERE timestamp || person || TYPE IN
(SELECT DISTINCT
ts
|| name
|| data_type
FROM edb.mv_1);
COMMIT;
--
INSERT INTO table
(person
timestamp,
TYPE)
SELECT name,
ts,
data_type
FROM edb.mv_1 a
WHERE a.row_id NOT IN
(SELECT row_id
FROM (SELECT v.*,
ROW_NUMBER ()
OVER (
PARTITION BY v.name,
v.data_type,
v.ts
ORDER BY row_id)
AS rn
FROM mv_1 v) t
WHERE rn > 1)
注意: row_id 是我在 MV_1 中创建的一列,这样我就有一列可以给我一个唯一的标识符。
提前致谢!
【问题讨论】:
-
问题实际上是因为
mv_1中的复合键组合已经存在于目标表中吗?还是因为mv_1中有重复项?在您的第二种删除类型中使用distinct暗示后者。 (还有distinct和in()有点毫无意义)。如果您确实有重复的密钥,您如何决定保留哪个? (另外,要真正解决您关于跳过行的问题:是的;DML error logging。) -
感谢您的回复@AlexPoole。我想插入/保留最新值。复合键存在于目标表中,但不存在于物化视图 (MV_1) 中。有两种情况会发生重复 1) 实际上在 MV_1 中重复 2) 该特定复合键已经存在的记录(如果有意义的话)。
标签: sql oracle duplicates sql-delete