[pgsql-jp: 37062] Re: SELECT の性能

psql_aby @ yahoo.co.jp psql_aby @ yahoo.co.jp
2006年 5月 17日 (水) 11:40:43 JST


abyです

NULLを切とりたいならば以下のSQLはどうでしょうか?

SELECT t1.*,
       (select f2 from t2 WHERE f1 = t1.f1) f2
  FROM t1
 WHERE f3=0 
   AND f2='xxx'
   AND t1.f4=false 
   AND f5 IS NOT NULL 
 ORDER BY f6 DESC LIMIT 300;

--- 河本陽一 <komoto.yoichi @ kcc.co.jp> からのメッセージ:
> こうもとです。
> 
> psql_aby さんの書いたこと:
> > joinをやめてサブクエリーを利用したものはどうでしょうか?
> > 
> > SELECT t1.*,
> >        (select f2 from t2 
> >          WHERE f1 = t1.f1 
> >            AND f2='xxx') f2
> >   FROM t1
> >  WHERE f3=0 
> >    AND t1.f4=false 
> >    AND f5 IS NOT NULL 
> >  ORDER BY f6 DESC LIMIT 300;
> 
>  この方法を試してみましたが、f2='xxx'の条件にあっていないレコードは
> その部分がNULLとなるだけで、ほしい結果とは違いました。

 
ちなみに河本さんが以下に書かれたSQLはFROM句で結合してしまっているため
暗黙的外部結合となり最初のプランと変わらない結果になったのだと思います。
サブクエリーを使用する場合は求めるフィールドを一つに絞るということが
肝心です。

>  サブクエリーを利用ということで、以下のようにやってみましたが、プラ
> ンは最初のものと変わりませんでした。
> 
> SELECT * FROM t1, (select * from t2 where f2='xxx') as t2a WHERE t1.f1=t2a.f1 and f3=0 AND
> t1.f4=false AND f5 IS NOT NULL ORDER BY f6 DESC LIMIT 300;


--------------------------------------
Yahoo! JAPAN 10th Anniversary Special Feature
--- Enjoy Yahoo! Auction with Yahoo! Mail !! ---
http://pr.mail.yahoo.co.jp/auction/



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