2017-02-19 98 views
0

我是新來的Pos​​tgres - 它已經多年,因爲我做了什麼SQL相關的,所以我也許過思考 - 但...Postgres:WHERE IN子選擇多列?

我有選擇一堆的子查詢ID(cs_seed)以執行另一個查詢。

我希望能夠做的是維護子查詢的順序。我搜索了幾個小時,發現row_number()功能似乎很有前途,但我顯然不能在WHERE IN查詢中使用它,因爲它返回多個列。

SELECT ca_seed, ca_biome, ca_percent 
FROM colours_area 
WHERE ca_seed IN (SELECT cs_seed, row_number() OVER (ORDER BY cs_percent DESC) AS rn 
        FROM colours_spawn 
        WHERE cs_biome = 140 
        ORDER BY cs_percent DESC LIMIT 10) 
ORDER BY rn DESC; 

有沒有什麼辦法可以做到這一點?或者我的方法錯了?

+2

不太確定爲什麼簡單的JOIN在這裏不起作用? – jcaron

+0

IN()括號之間的選擇必須只返回一列 – McNets

回答

1

使用join

SELECT ca.ca_seed, ca.ca_biome, ca.ca_percent 
FROM colours_area ca JOIN 
    (SELECT cs_seed, row_number() OVER (ORDER BY cs_percent DESC) AS rn 
     FROM colours_spawn 
     WHERE cs_biome = 140 
     ORDER BY cs_percent DESC 
     LIMIT 10 
    ) cs 
    ON ca.ca_seed = cs.cs_seed 
ORDER BY rn DESC; 

這假定cs_seed只有在子查詢中出現一次。否則,你可能需要做更多的操作來處理重複。

+0

有一些國際海事組織:http://pastebin.com/vKBWk5d0 – Abelisto

+0

這是類似於我最初嘗試的東西,但它不會產生結果,我知道是正確的對主查詢應用'WHERE ca_seed IN()'子句。 這就是爲什麼我使用子查詢返回'cs_seeds'列表,然後從'colours_area'表中獲取匹配項的原因。由於關係的緣故,結果的重複不會影響我。 –