4

冗長なデータを持つテーブルがあり、サブ行が重複しているすべての行を特定しようとしています (より良い言葉がないため)。サブ行とは、考慮COL1してCOL2のみという意味です。

だから私はこのようなものを持っているとしましょう:

 COL1   COL2   COL3
 ---------------------
 aa     111    blah_x
 aa     111    blah_j
 aa     112    blah_m
 ab     111    blah_s
 bb     112    blah_d
 bb     112    blah_d
 cc     112    blah_w
 cc     113    blah_p

これを返す SQL クエリが必要です。

 COL1   COL2   COL3
 ---------------------
 aa     111    blah_x
 aa     111    blah_j
 bb     112    blah_d
 bb     112    blah_d
4

10 に答える 10

8

これはうまくいきますか?

select t.* from table t
left join ( select col1, col2, count(*) as count from table group by col1, col2 ) c on t.col1=c.col1 and t.col2=c.col2
where c.count > 1
于 2008-09-25T01:40:43.843 に答える
5

リストしたデータでは、クエリは実行できません。行 5 と 6 のデータは、それ自体で区別されません。

テーブルの名前が「quux」であると仮定すると、次のようなものから始めると:

SELECT a.COL1, a.COL2, a.COL3 
FROM quux a, quux b
WHERE a.COL1 = b.COL1 AND a.COL2 = b.COL2 AND a.COL3 <> b.COL3
ORDER BY a.COL1, a.COL2

あなたはこの答えで終わるでしょう:

 COL1   COL2   COL3
 ---------------------
 aa     111    blah_x
 aa     111    blah_j

これは、5 行目と 6 行目の COL3 の値が同じであるためです。行 5 と 6 の両方を返すクエリは、このデータセット内のすべての行の複製も返します。

一方、主キー (ID) がある場合は、代わりに次のクエリを使用できます。

SELECT a.COL1, a.COL2, a.COL3
FROM quux a, quux b
WHERE a.COL1 = b.COL1 AND a.COL2 = b.COL2 AND a.ID <> b.ID
ORDER BY a.COL1, a.COL2

[WHERE句を簡略化するために編集]

そして、あなたが望む結果を得るでしょう:

COL1   COL2   COL3
---------------------
aa     111    blah_x
aa     111    blah_j
bb     112    blah_d
bb     112    blah_d

これを SQL Server 2000 でテストしましたが、最新の SQL データベースでも同じ結果が得られるはずです。

blorgbeardは私が間違っていることを証明しました-- 彼にとって良いことです!

于 2008-09-25T01:40:02.833 に答える
4

次のように参加してください。

SELECT a.col3, b.col3, a.col1, a.col2 
FROM tablename a, tablename b
WHERE a.col1 = b.col1 AND a.col2 = b.col2 AND a.col3 != b.col3

postgresql を使用している場合は、次のように oid を使用して、結果の重複を少なくすることができます。

SELECT a.col3, b.col3, a.col1, a.col2 
FROM tablename a, tablename b
WHERE a.col1 = b.col1 AND a.col2 = b.col2 AND a.col3 != b.col3
  AND a.oid < b.oid
于 2008-09-25T01:35:57.350 に答える
2

これをテストするのに便利なデータベースはありませんが、うまくいくはずです...

select
  *
from
  theTable
where
  col1 in
    (
    select
      col1
    from
      theTable
    group by
      col1||col2
    having
      count(col1||col2) > 1
    )
于 2008-09-25T01:37:40.123 に答える
2

私の素朴な試みは

select a.*, b.* from table a, table b where a.col1 = b.col1 and a.col2 = b.col2 and a.col3 != b.col3;

しかし、それはすべての行を 2 回返します。一度返すだけに制限する方法がわかりません。おそらく主キーがあれば、「and a.pkey < b.pkey」を追加できます。

私が言ったように、それはエレガントではなく、おそらくこれを行うためのより良い方法があります.

于 2008-09-25T01:38:39.060 に答える
2

このようなものが動作するはずです:

SELECT a.COL1, a.COL2, a.COL3
FROM YourTable a
JOIN YourTable b ON b.COL1 = a.COL1 AND b.COL2 = a.COL2 AND b.COL3 <> a.COL3

一般に、JOIN 句には、「重複」の一部と見なされるすべての列 (この場合は COL1 と COL2) と、行の結合を排除するために少なくとも 1 つの列 (または必要な数の列) を含める必要があります。それ自体に (この場合は COL3)。

于 2008-09-25T01:43:11.530 に答える
2

これは、重複がないことを除いて、自己結合に非常に似ています。

select COL1,COL2,COL3
from theTable a
where exists (select 'x'
              from theTable b
              where a.col1=b.col1
              and   a.col2=b.col2
              and   a.col3<>b.col3)
order by col1,col2,col3
于 2008-09-25T01:48:08.460 に答える
1

重複を見つける方法は次のとおりです。あなたのデータでOracle 10gでテストされました。

select * from tst where (col1, col2) in (select col1, col2 from tst group by col1, col2 with count(*) > 1)

于 2008-10-01T04:46:39.937 に答える
0

COL1、COL2、COL3を選択

テーブルから

COL1、COL2、COL3によるグループ化

count(*)>1 を持つ

于 2008-09-25T02:43:10.263 に答える
0

結合を忘れる -- 分析関数を使用します。

select col1, col2, col3
from
(
select col1, col2, col3, count(*) over (partition by col1, col2) rows_per_col1_col2
from table
)
where rows_per_col1_col2 > 1
于 2008-09-25T03:27:28.783 に答える