2016-09-09 6 views
1

例が最も良い説明です。 のは、私は、次の表があるとしましょう:PERSONIDによってPersonCar(人や車の関連N X N)Oracle表のグループごとに最大行x行を削除する

╔════════════╦═════════════╗ 
║ PersonId ║ CarId  ║ 
╠════════════╬═════════════╣ 
║ 1   ║ 1   ║ 
║ 1   ║ 2   ║ 
║ 1   ║ 3   ║ 
║ 2   ║ 4   ║ 
║ 2   ║ 5   ║ 
╚════════════╩═════════════╝ 

Iグループの場合、このテーブル、ID = 1の人は、関連する3台を持っています。
PersonCarテーブルの行を削除して、人に最大2台の車を関連付けたいとします。私は、どの車が協会から削除されたのか気にしない。

これはexmpleです。実際には、負荷テストのためにあまりにも多くの関連付けを行った大きなテストテーブルがありますが、今はX association maxを置くことできれいにしたいと思います。

これはOracleデータベースです。

ありがとうございました。組み合わせ(person_id, car_id)を想定し

答えて

3

は表で、あなたはこのような何かを行うことができますユニークです:

delete from car_assignment 
where (person_id, car_id) 
     in (select person_id, car_id 
      from (
       select person_id, 
        car_id, 
        row_number() over (partition by person_id order by car_id) as rn 
       from car_assignment 
      ) t 
      where rn > 2); 
+0

を、私はそれを試してみて、戻ってくるだろう。 "タプル"で検索できることはわかりませんでした。知っておいてよかった。 – zizou

+0

それは働いて、タプルの検索を行う方法を学びました。ありがとうございました :) – zizou

1

このよう試みるについてどう:

Delete from PersonCar 
where rowid in (select row_id 
        from 
        (
        select rowid row_id,  
          personid , 
          row_number() over(partition by personid order by personid,carid) rnk  
        from PersonCar 

        ) 
        where rnk >=3 
       ); 
関連する問題