SQL查询计算整个重复行

时间:2017-11-06 17:06:54

标签: sql oracle duplicates

我正在寻求有关查询的帮助,以执行以下操作:

在插入行之前,查找2个表中有多少行与插入的信息相同。 所以基本上我想看看这一行是否完全重复。 我希望将其基于所有列,而不仅仅是PK,因为如果甚至有一列不同,那么这是一个有效的插入。

这是我所需要的,尽管不正确:

SELECT COUNT(*)
FROM ORDER_TRF_HEADER
WHERE
((SELECT * FROM ORDER_TRF_HEADER_COMPLETE WHERE MA_PONUM = '29608207') = (SELECT * FROM ORDER_TRF_HEADER WHERE MA_PONUM = '29608207'));

表 - ORDER_TRF_HEADER

MA_CUST VARCHAR2(8 BYTE) MA_PONUM VARCHAR2(30 BYTE) MA_ODATE VARCHAR2(8 BYTE) MA_ITEMS NUMBER(3,0) MA_SALEM VARCHAR2(2 BYTE) MA_PDAYS NUMBER(3,0) MA_CURR VARCHAR2(3 BYTE)

表 - ORDER_TRF_HEADER_COMPLETE

MA_CUST VARCHAR2(8 BYTE) MA_PONUM VARCHAR2(30 BYTE) MA_ODATE VARCHAR2(8 BYTE) MA_ITEMS NUMBER(3,0) MA_SALEM VARCHAR2(2 BYTE) MA_PDAYS NUMBER(3,0) MA_CURR VARCHAR2(3 BYTE)

由于

2 个答案:

答案 0 :(得分:1)

  

我想基于所有列,而不仅仅是PK,因为如果甚至有一列不同,那么这是一个有效的插入。

那么您的问题是您没有正确定义主键。

当然,有充分的理由不维护由记录中的每个属性组成的主键,但是比在插入之前以如此笨拙的方式检查重复项更好的解决方案是将数据保持为唯一键

答案 1 :(得分:0)

您可以尝试INTERSECT

SELECT COUNT(*)
FROM   (SELECT *
        FROM   order_trf_header_complete
        WHERE  ma_ponum = '29608207'
        INTERSECT
        SELECT *
        FROM   order_trf_header
        WHERE  ma_ponum = '29608207') ;

注意::您最好明确使用所有列名,而不是选择*