请求会搜索具有固定' id'的对象。只有版本较高的行'应该返回(最新版本)。但是如果较高版本已删除'那么根本不应返回任何行。列真实。
示例:
|id |version |deleted |
|0 |1 |false |
|0 |2 |false |
|1 |1 |false |
|1 |2 |false |
|1 |3 |true |
id 0的请求应该返回
|1 |2 |false |
但是id 1的请求应该不返回任何内容
我可以用INTERSECT做到这一点:
SELECT id, version, deleted FROM elements WHERE id = 1 AND deleted = 'false'
INTERSECT
SELECT id, MAX(version), deleted FROM elements WHERE id = 1
但有更好的方法吗?
答案 0 :(得分:0)
我倾向于用子查询做到这一点:
select e.*
from (select id, version, deleted
from elements
where id = 1
order by version desc
limit 1
) e
where deleted = 'false';
每id
最多返回一行。只有在delete = 'false'
。
答案 1 :(得分:0)
这可以通过使用Row_number()
功能实现,方法是根据版本对行进行排序,并使用版本最大的行并使用WHERE
子句忽略deleted <> false
select id, version, deleted from (
select id, version, deleted, row_number() over
(partition by id order by version desc) where deleted = 'false'
) A where rown = 1
答案 2 :(得分:0)
我会选择:
WITH src AS ( -- subquery gets the newest version for each of the ids
SELECT DISTINCT ON (id)
*
FROM testtab
ORDER BY id, version DESC
)
SELECT * FROM SRC
WHERE NOT deleted -- or deleted = 'false' depending on it's type
AND id = 0 -- your id goes here