[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 メーリングリストの案内