2014-02-10 226 views
0

我有兩個表名爲playerteam,它們通過名爲player_team的第三個表以多對多關係連接在一起。優化PostgreSQL SELECT查詢(sqlfiddle)

表結構&當前查詢,可以發現:http://sqlfiddle.com/#!2/e6db4/18

我需要一個查詢,返回玩家的數據,與team.id,其中包括玩家的最大額定值一起。另外,如果評分是<= X,那麼該玩家應該被排除。

示例查詢返回正確的結果,但效率非常低。

顯然,同樣的結果可以通過訪問一次每個表中的行來實現,但問題是如何實現這一目標? (我要選擇一個在PostgreSQL方言回覆)

回答

0

下面是一個查詢,你可以嘗試:

with all_comb as (
select p.id as PLID, 
     t.id as TID, 
     t.rating as RATING 
    from player p, 
     team t, 
     player_team pt 
where p.id = pt.pid 
    and t.id = pt.tid 
    and t.rating >0) 

select distinct 
     a.PLID, 
     a.TID, 
     a.RATING 
    from all_comb a 
where a.RATING = (
     select max(b.RATING) 
     from all_comb b 
     where a.PLID = b.PLID) 
order by PLID; 

的sqlfiddle是here