如何比较ROWID

时间:2016-08-31 09:08:08

标签: sql oracle

我有一个表t1和表t2。如表t1中那样,主要约束将处于禁用状态。主要约束在列C1,C2上,而表t2没有任何约束。

当我尝试在表PK_test中启用主要约束t1时,如果有任何异常(记录违反约束)将保存在表t2中。表t1将列c1,c2如下所示。

C1   C2 ROWID
1     2 ABCD
1     2 ABCE
1     2 ABCF
7     8 ABCI

表格t2将包含带有数据

的列ROWID
ROWID
ABCD
ABCE
ABCF

因为只有这些行违反PK

所以我想只保留表min(ROWID)中的t2作为列C1,C2。 所以我写了一个查询

delete * 
from t2 
where ROWID not in(select min(ROWID) 
                     from t1 
                    where ROWID in (select ROWID 
                                      from t2) 
                     group by C1,C2);

但是上面的查询也写了NULL select min(rowed)..查询正确返回1 ROWS(ABCD)

请帮助找出这里到底出了什么问题。

2 个答案:

答案 0 :(得分:1)

我会把它写成:

delete t2
    where t2."RowId" not in (select min(t1."RowId")
                             from t1
                             group by c1, c2
                            );

答案 1 :(得分:0)

这里我试图删除任何大于min(ROWID)的t2.ROWID,这个t1具有相同的C1和C2

delete t2 
where t2."ROWID" > (select min(a."ROWID") 
                      from t1 join t1 a on t1.c1 = a.c1 and t1.c2 = a.c2
                     where t1."ROWID" = t2."ROWID");
相关问题