【问题标题】:find duplicate values within delimiter在分隔符内查找重复值
【发布时间】:2012-07-26 21:14:40
【问题描述】:

太好了,这是我发布的第一个问题,我很快就得到了回复。 :-)

让我更清楚地了解我的问题。这是表结构:-

CREATE TABLE ct_collreview_atg (csku NUMBER, merch_opt NUMBER, ri_seq VARCHAR2(4000));

Insert into CT_COLLREVIEW_ATG Values (100293, 17, ',5,');
Insert into CT_COLLREVIEW_ATG Values (100293, 17, ',10,');
Insert into CT_COLLREVIEW_ATG Values (100293, 17, ',70,');
Insert into CT_COLLREVIEW_ATG Values (100293, 17, ',30,60,');
Insert into CT_COLLREVIEW_ATG Values (100293, 17, ',30,80,');
Insert into CT_COLLREVIEW_ATG Values (100293, 17, ',30,50,');
Insert into CT_COLLREVIEW_ATG Values (100293, 17, ',20,50,');
Insert into CT_COLLREVIEW_ATG Values (100293, 17, ',40,');
Insert into CT_COLLREVIEW_ATG Values (100293, 17, ',110,');
Insert into CT_COLLREVIEW_ATG Values (100293, 17, ',90,');
Insert into CT_COLLREVIEW_ATG Values (100293, 17, ',100,');
COMMIT;

现在,如果我执行“从 ct_collreview_atg 中选择 *;”

我得到了这个数据集:-

CSKU  |MERCH_OPT  |RI_SEQ

100293  |17 |,5,
100293  |17 |,10,
100293  |17 |,70,
100293  |17 |,30,60,
100293  |17 |,30,80,
100293  |17 |,30,50,
100293  |17 |,20,50,
100293  |17 |,40,
100293  |17 |,110,
100293  |17 |,90,
100293  |17 |,100,

如果您看得清楚,30 和 50 会在多行中重复出现。所以我想要的是一个查询,它只会显示我正在重复的数字。在这种情况下,它应该显示 30 和 50,因为其余所有数字都出现一次。

我的 oracle 版本是 (10.2.0.3.0) 谢谢你的帮助。

【问题讨论】:

  • 我不得不问...对不起。为什么这没有正确规范化,以便您可以与 group by 一起做呢?有什么办法可以正常化吗?

标签: sql oracle


【解决方案1】:

我很困惑——我在示例中看不到重复项。

无论如何,一些谷歌搜索表明使用 GROUP BY 和 HAVING 可能是您的选择:

select csku, merch_opt, ri_seq from ct_collreview_atg
where rec_type = 'PROD'
and row_status = 'A'
and csku = 100293
GROUP BY csku, merch_opt
HAVING ( count(cksu) > 1 )

【讨论】:

    【解决方案2】:

    对于您的具体情况,Regular Expressions 可能有效:

       with dups as(
    select 
              t.ri_seq
             , regexp_substr (t.ri_seq, '[^,]+', 1, rn) spl
        from CT_COLLREVIEW_ATG t
         cross
         join (select rownum rn
           from (select max (length (regexp_replace (t.ri_seq, '[^,]+'))) + 1 mx
                         from CT_COLLREVIEW_ATG t
                      )
              connect by level <= mx
              )
       where regexp_substr (t.ri_seq, '[^,]+', 1, rn) is not null)
    select distinct spl from (
    select spl, row_number() over (partition by spl order by 1) dp from dups)
    where dp>1
    

    上面的查询首先将逗号分隔的值拆分为行,然后检测这些行中的重复项。在这个例子中,30&50。

    Here 是原始查询。

    【讨论】:

      【解决方案3】:

      您必须使用列 RI_SEQ 中出现的值创建一个名为 TSEQ 的辅助表(或者,如果值是连续的,您可以生成此表)。

      例如,

      Create table TSEQ (SEQ varchar(3));
      insert into tseq values ("5");
      insert into tseq values ("50"),
      ...
      insert into tseq values ("110"),
      etc.
      

      然后您在包含 SEQ 的 RI_SEQ 上加入 TSEQ 和 CT_COLLREVIEW_ATG 并通过具有这样的 count(*) 获得使用 group 重复 SEQ 的行组:

      select seq,count(*) from tseq join CT_COLLREVIEW_ATG t on ri_seq  like '%,'||seq||',%' group by 1 having count(*) >1;
      

      【讨论】:

        猜你喜欢
        • 2021-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-04
        • 2014-08-04
        • 1970-01-01
        相关资源
        最近更新 更多