【问题标题】:How to remove the duplicate record in oracle queryoracle查询中如何去除重复记录
【发布时间】:2016-07-18 14:01:07
【问题描述】:

表一:

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

请您看看我应该怎么做才能从我的查询中删除那条记录

【问题讨论】:

  • 我不确定您要删除哪一行,也不确定您使用的是哪个 RDBMS。
  • 我对我不想看到的记录发表评论,因为 ID 234 有两个 CODE_ID,并且两个 CODE_ID 都不存在于 Table1 中
  • 这不是真的,code_id 1415确实存在于表1和表2中?
  • 如果table2中每个code_id有3个状态怎么办?
  • @Qasim0787 还有,如果第二行的 code_id = 1415,但 id 不同怎么办? (例如 123)您希望同时看到 1415 行吗?

标签: mysql oracle oracle11g


【解决方案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

【讨论】:

  • Table1 和 Table2 是大表,我不能这样写 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
  • 完美你是天才
  • 是的,“with”子句只是用来模仿你的表......你可以把它们去掉,只保留 w_sub 和 main 查询......;)
【解决方案2】:

这是使用分析函数的替代方法,假设您在 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 有两行但两者具有相同的状态,并且您想排除这种情况)。

【讨论】:

  • 是的,这就是我想出的……只有 1 个细微的差别,我没有假设 2 行 :) 但小问题,因为 OP 似乎表示 2 行……; )
  • 我也没有假设 2 行?我的查询“每个 id 和 code_id 超过 1 行”,而不是“每个 id 和 code_id 两行”
  • 啊,“t2.code_id”没有看到你的分区......这与我使用的不同......让我发布我的......因为我们的行为不同,例如数据:ID : 234, 和 4 行: CODE_ID: 1415, 1415, 1410, 1410 ... ;) 这就是我不假设 2 行的意思.. ;)
【解决方案3】:

试试这个:

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
)

【讨论】:

  • 还要记住 Boneist 先生提出的观点。如果您不想显示大于 2 的记录,请将 HAVING COUNT() > 1 行替换为:HAVING COUNT() = 2 或者你可以在这一行做任何检查
猜你喜欢
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
  • 2015-09-27
  • 1970-01-01
  • 1970-01-01
  • 2013-06-25
  • 2011-04-28
  • 1970-01-01
相关资源
最近更新 更多