[pgsql-jp: 34580] Re: 自分のテーブルのローを削除したい。

渡辺 伸雄 watanove @ nifty.ne.jp
2004年 12月 28日 (火) 19:14:41 JST


石田さん、こんにちは。
レスありがとうございます。

石田さんWrote

>oidのかわりに、(memberid, assigntime)を使います。
>
>delete from x
>  where not (memberid, assigntime) in
>           (select x2.memberid, x2.assigntime
>              from (select max(assigntime) as ma, memberid
>                      from x
>                     group by memberid) x1
>                   join x x2
>                   on (x1.memberid = x2.memberid
>                  and x1.ma = x2.assigntime))
>  
>
おー!
  where not (memberid, assigntime) in
で、x.memberidがそのin句の一つのローのmemberidに等しく
 かつ x.assigntimeもそのローのassigntimeに等しい、
という意味になるんですね。

これは、PostgreSQL特有の使い方じゃないですね。
(結構たくさんSQLを書いていたんだけど・・)



>重複した値があった場合の挙動は違いますが、これでもいけます。
>
>delete from x
>  where not (memberid, assigntime) in
>           (select x2.memberid, x2.assigntime
>              from x x2
>             where x.memberid = x2.memberid
>             order by x2.assigntime
>             limit 1)
>
>  
>
limit 1は多くのDBでは採用されていないですよね。

大変、勉強になりました。
というか、自分の中では大きな一歩進めさせて頂いた感じです。
ありがとうございました!







pgsql-jp メーリングリストの案内