我有一个包含以下相关列的表:
index | name
------------
1 John
2 Steve
3 Bill
4 Dave
5 Bart
我想选择索引小于4的前两个最接近的名称,我希望这些结果按索引递增排序。所以我想选择:
index | name
------------
2 Steve
3 Bill
我提出了以下问题:
SELECT index, name
FROM (
SELECT index, name
FROM my_table
WHERE index < 4
ORDER BY index DESC
LIMIT 2
) s
ORDER BY index ASC;
此查询按我的意图运行。但我想知道是否有更好/更聪明的方法来做到这一点。所以这个问题主要是出于重写这个工作查询的兴趣,从替代方法中学习。
我正在使用PostgreSQL 10.1。
答案 0 :(得分:1)
您可以使用CTE代替嵌套查询,这可能(或可能不)更容易阅读:
WITH two_below_four AS (
SELECT index, name
FROM my_table
WHERE index < 4
ORDER BY index DESC
LIMIT 2
)
SELECT * FROM two_below_four ORDER BY index;
此外,您可以从外部ORDER BY中省略ASC,因为升序是默认值。
请注意,对于发布的数据,以下查询也有效:
SELECT * FROM my_table WHERE index IN (4-2,4-1) ORDER BY index;
SELECT * FROM my_table WHERE index >= 4-2 and index < 4 ORDER BY index;
SELECT * FROM my_table WHERE index BETWEEN 4-2 and 4-1 ORDER BY index;
SELECT * FROM my_table WHERE index >= 4-2 ORDER BY index LIMIT 2;
当然,只有在没有“差距”的情况下,这些工作才会起作用。在索引中。