2017-02-19 97 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'表中获取匹配项的原因。由于关系的缘故,结果的重复不会影响我。 –