有两个表x_ass_table
和i_ass_table
:
我将来自x_ass_table
的13000条记录的数据插入i_ass_table:
i_ass_table
CREATE UNIQUE INDEX i_ass_table_pk ON i_ass_table(ASSIGNMENT_NUMBER,EFFECTIVE_START_DATE,EFFECTIVE_END_DATE,EFFECTIVE_LATEST_CHANGE)
insert into i_ass_table select * from x_ass_table;
我收到一个唯一的约束错误
00001. 00000 - "unique constraint (%s.%s) violated"
*Cause: An UPDATE or INSERT statement attempted to insert a duplicate key.
For Trusted Oracle configured in DBMS MAC mode, you may see
this message if a duplicate entry exists at a different level.
*Action: Either remove the unique restriction or do not insert the key.
这必须是数据的错误。但是,我如何检查13000条记录中的哪些数据是破碎的还是重复的
答案 0 :(得分:2)
您可以使用count()
函数的分析版本,通过组合您想要唯一的字段对源行进行编号,然后查询以查看哪个组合具有多个行。 E.g:
SELECT *
FROM (SELECT *,
COUNT() OVER (PARTITION BY assignment_number,
effective_start_date,
effective_end_date,
effective_latest_change) AS c
FROM x_ass_table) t
WHERE c > 1
答案 1 :(得分:2)
正如您所问,您必须在两个表中检查唯一约束冲突。
x_ass_table
是否有基于唯一键的重复记录,您可以使用Mureinik在上述答案中提供的查询进行检查。 其次,您必须检查两个表中是否存在基于唯一键的相同记录,该唯一键还可以创建唯一约束冲突。您可以查看以下查询。
select *
from x_ass_table x,
i_ass_table i
where i.assignment_number = x.assignment_number
and i.effective_start_date = x.effective_start_date
and i.effective_end_date = x.effective_end_date
and i.effective_latest_change = x.effective_latest_change;
答案 2 :(得分:1)
你可以尝试
SELECT * FROM x_ass_table GROUP BY ASSIGNMENT_NUMBER HADING COUNT(*)> 1