太好了,这是我发布的第一个问题,我得到了如此快速的答复。 : - )
让我更清楚地了解我的问题。这是表结构: -
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;
现在如果我做'Select * from 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) 谢谢你的帮助。
答案 0 :(得分:0)
我很困惑 - 我没有在示例中看到重复。
无论如何,一些谷歌搜索建议使用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 )
答案 1 :(得分:0)
您必须使用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(*)得到重复SEQ使用group的行组:
select seq,count(*) from tseq join CT_COLLREVIEW_ATG t on ri_seq like '%,'||seq||',%' group by 1 having count(*) >1;
答案 2 :(得分:0)
对于您的具体情况, 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&amp; 50。
Here 是原始查询。