2016-03-30 63 views
0

表1:如何删除Oracle查询重复记录

ID CODE_ID 
123 1010 
234 1415 

表2:

ID STATE CODE_ID 
123 9 1010 
123 13 1010 
234 20 1415 
234 30 1410 

我的查询:

select a.ID, b.STATE, b.CODE_ID 
from Table1 a, Table2 b 
where a.ID = b.ID 
and a.CODE_ID = b.CODE_ID 

当前查询结果:

ID STATE CODE_ID 
123 9 1010 
123 13 1010 
234 20 1415 --------record dont want to see in result. 

我预期的结果

ID STATE CODE_ID 
123 9 1010 
123 13 1010 

你能不能请看起来我应该怎么做才能删除从我的查询

+0

我不知道你想删除哪行,也没有你使用的RDBMS。 – Strawberry

+0

我对我不希望看到的记录发表评论因为ID 234有两个CODE_ID,并且两个CODE_ID都不存在于Table1 – Qasim0787

+1

这不是真的,code_id 1415确实存在于表1和表2中吗? – Jester

回答

1

下面是一个使用分析另一种方式......

with Table1 as (
      select 123 id, 1010 code_id from dual union all 
      select 234 id, 1415 code_id from dual 
      ), 
     Table2 as (
      select 123 id, 9 state, 1010 code_id from dual union all 
      select 123 id, 13 state, 1010 code_id from dual union all 
      select 234 id, 20 state, 1415 code_id from dual union all 
      select 234 id, 20 state, 1415 code_id from dual union all 
      select 234 id, 20 state, 1410 code_id from dual union all 
      select 234 id, 30 state, 1410 code_id from dual 
      ), 
    w_sub as (
     select a.id aid, b.ID bid, b.STATE, b.CODE_ID, 
       count(a.id) over (partition by b.id) chk, 
       count(*) over (partition by b.id) chkt 
     from Table2 b 
      left outer join 
       Table1 a 
       on a.ID = b.ID 
       and a.CODE_ID = b.CODE_ID 
     ) 
    select bid id, state, code_id 
    from w_sub 
    where chk = chkt 
/

      ID  STATE CODE_ID 
    ---------- ---------- ---------- 
     123   13  1010 
     123   9  1010 
+0

表1和表2是巨大的表,我不能写他们这样select 123 id,9 state,1010 code_id from dual union全部 select 123 id,13 state,1010 code_id from dual union全部 select 234 id,20 state,1415 code_id from dual union全部 select 234 id,20 state,1415 code_id来自双联合所有 select 234 id,20 state,1410来自双联盟的code_id全部 select 234 id,30 state,1410 code_id from双 – Qasim0787

+0

得到它完美你是天才 – Qasim0787

+0

是的, “子句只是模仿你的桌子......你会把它们拿出来,只保留w_sub和主查询......;) – Ditto

0

一个记录试试这个:

SELECT a.ID, b.STATE, b.CODE_ID 
FROM Table1 a, Table2 b 
WHERE 
    a.ID = b.ID 
    AND a.CODE_ID = b.CODE_ID 
    AND a.CODE_ID IN 
(
    SELECT CODE_ID FROM Table2 
    GROUP BY CODE_ID HAVING COUNT(*) > 1 
) 
+0

我正在尝试这个 – Qasim0787

+0

还记得Boneist先生提出的观点。如果你不想显示大于2的记录,用下面的命令替换** HAVING COUNT(*)> 1 **:** HAVING COUNT(*)= 2 **或者你可以在这里做任何检查这条线 –

+0

nope仍然给我相同的结果 – Qasim0787

1

下面是使用分析功能的替代,假设你在t2中的行之后,每个id和code_id有多于1行:

select id, 
     state, 
     code_id 
from (select t2.id, 
       t2.state, 
       t2.code_id, 
       count(*) over (partition by t2.id, t2.code_id) cnt 
     from table1 t1 
       inner join table2 t2 on (t1.id = t2.id 
             and t1.code_id = t2.code_id)) 
where cnt > 1; 

如果您在每行id和code_id只有两行的行之后,请改为使用where cnt = 2

如果你与不同状态多行后,然后更换count(*)count(distinct t2.state)(例如,如果有两行的ID和code_id但两者具有相同的状态,要排除这种情况下)。

+0

是啊,这就是我想出的...只有一个微妙的区别,我没有假设2行:)但在那里小问题,因为OP似乎表明2行.. 。;) – Ditto

+0

我没有假设2行?我的查询“每个ID和code_id超过1行”,而不是“每个ID和code_id两行” – Boneist

+0

啊,没有看到你的分区通过“t2.code_id”..这是不同于我用...让我们我发布我的...然后...因为我们的行为不同,例如数据:ID:234和4行:CODE_ID:1415,1415,1410,1410 ...;)这就是我的意思是不假设2行..;) – Ditto