1

私はこのようなテーブルを持っています

c_id           b_id
13              151
27              203
38              347
38              349
38              357
72              132
72              475
104             14
151             22
207             690
207             712

ご覧のとおり、テーブルは最初に c_id で、次に b_id で並べられています。すべての c_id の最初のエントリを削除したいと思います。

だから私の出力テーブルはこれでなければなりません

c_id            b_id
38              349 
38              357
72              475
207             712

b_id が 1 つしか関連付けられていない c_id は削除されました。また、他の c_id の最初の b_id は削除されています。

複数のクエリを使用できます。元のテーブルには数百万行あります。

4

4 に答える 4

2
SELECT cb.c_id, cb.b_id
  FROM cb
  LEFT JOIN (
    SELECT c_id, MIN(b_id) AS minb_id
      FROM cb
      GROUP BY c_id
    ) cbmin ON cb.c_id = cbmin.c_id AND cb.b_id = cbmin.minb_id
  WHERE cbmin.c_id IS NULL
于 2012-09-12T10:47:56.830 に答える
1

c_id の最初の選択リスト

c_id によるテーブル グループから c_id を選択

各 c_id の最初の要素を取得して削除

DELETE FROM TABLE 
      WHERE ID = (SELECT ID
                    FROM (SELECT ROW_NUMBER () OVER (ORDER BY ID) row_no, a.*
                            FROM TABLE a
                           WHERE a.ID = 11)
                   WHERE row_no = 1)
于 2012-09-12T10:45:55.603 に答える
1
SELECT * 
FROM 
(
    SELECT c_id, b_id, 
        ROW_NUMBER() OVER(PARTITION BY c_id ORDER BY c_id DESC) RowNum
    FROM TestTable
    WHERE c_id IN 
       (
           SELECT c_id 
           FROM TestTable 
           GROUP BY c_id
           HAVING COUNT(b_id) > 1
       )
) t WHERE RowNum > 1

これにより、次のようになります。

c_id   b_id   RowNum
--------------------
38     349     2
38     357     3
72     475     2
207    712     2

ライブデモ

于 2012-09-12T10:31:36.500 に答える
1
SELECT cb.c_id, cb.b_id
  FROM cb
  LEFT JOIN cb cbmin ON cb.c_id = cbmin.c_id
  GROUP BY cb.c_id, cb.b_id
  HAVING cb.b_id > MIN(cbmin.b_id)
于 2012-09-12T10:49:49.607 に答える