PostgreSQL Part.5at DB
PostgreSQL Part.5 - 暇つぶし2ch502:NAME IS NULL
08/05/07 21:34:20 Lqr18+2G
postgresql8.2のSQLで質問があります。

lent /*貸し出し管理*/
+id
+bookid 書籍ID
+lentdate 貸し出し日

book /*書籍*/
+id
+name 書籍名
+fromdate 有効期間(開始日)
+todate 有効期間(終了日)

select lent.lentdate, lent.bookid, min(book.name), count(*) as lent_count
  from (
    select lent.id, lent.bookid, ... from lent, ... where 条件1
    union
    select lent.id, lent.bookid, ... from lent. ... where 条件2
    ) lent
  left outer join book on lent.bookid = book.id and lent.lentdate >= book.fromdate and lent.lentdate <= book.todate
group by lent.lentdate, lent.bookid

本当は、グルーピングしたlent.lentdateの最小値の日付でbook.nameを取得したいのですがやり方がわかりません。
仕方なく、下記のようにbook.fromdate || book.nameで取得して、フェッチ後にbook.nameだけ切り出そうと考えました。
select lent.lentdate, lent.bookid, min(book.fromdate || book.name), count(*) as lent_count
  from (
    select lent.id, lent.bookid, ... from lent, ... where 条件1
    union
    select lent.id, lent.bookid, ... from lent. ... where 条件2
    ) lent
  left outer join book on lent.bookid = book.id and lent.lentdate >= book.fromdate and lent.lentdate <= book.todate
group by lent.lentdate, lent.bookid

しかしmin(book.fromdate || book.name)でグルーピング単位の最小値の値が返ってきません。ちょっと考えられない結果です。
試しにインラインビューの中のunionをやめてみたら、期待した値が返ってきました。
select lent.lentdate, lent.bookid, min(book.fromdate || book.name), count(*) as lent_count
  from (
    select lent.id, lent.bookid, ... from lent, ... where 条件1
    ) lent
  left outer join book on lent.bookid = book.id and lent.lentdate >= book.fromdate and lent.lentdate <= book.todate
group by lent.lentdate, lent.bookid

unionがいけないのか特定したくて、うまくいった条件1の方のSQLをunionで2本繋いでみるとNG(minの結果が変)になりました。
select lent.lentdate, lent.bookid, min(book.fromdate || book.name), count(*) as lent_count
  from (
    select lent.id, lent.bookid, ... from lent, ... where 条件1
    union
    select lent.id, lent.bookid, ... from lent, ... where 条件1
    ) lent
  left outer join book on lent.bookid = book.id and lent.lentdate >= book.fromdate and lent.lentdate <= book.todate
group by lent.lentdate, lent.bookid

・インラインビューの実体がunionで繋がれた複数SQLであること
・そのインラインビューでグルーピングすること
・そのインラインビューに外部結合した値をmin()関数で取得すること

この辺でpostgresqlの制限に引っかかっているようなことがありませんでしょうか?


次ページ
続きを表示
1を表示
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch