3

すばらしい、それが投稿された最初の質問で、とても早く返信がありました。:-)

私の質問をもっと明確にさせてください。ここにテーブル構造があります:-

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 と表示されるはずです。

私のオラクルのバージョンは(10.2.0.3.0)です。助けてくれてありがとう。

4

3 に答える 3

0

特定のケースでは、正規表現が機能する場合があります。

   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 です。

これが元のクエリです。

于 2012-08-18T18:29:49.110 に答える
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(*) を次のように指定して、group を使用して SEQ を繰り返す行のグループを取得します。

select seq,count(*) from tseq join CT_COLLREVIEW_ATG t on ri_seq  like '%,'||seq||',%' group by 1 having count(*) >1;
于 2012-08-18T15:49:55.010 に答える
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 )
于 2012-07-27T04:02:43.927 に答える