Sql 如何仅在符合条件的情况下检索具有最大值的行,否则不应返回任何内容
请求搜索具有固定“id”的对象。只应返回“版本”较高的行(最新版本)。但如果更高版本的“deleted”列为true,则不应返回任何行 例如:Sql 如何仅在符合条件的情况下检索具有最大值的行,否则不应返回任何内容,sql,Sql,请求搜索具有固定“id”的对象。只应返回“版本”较高的行(最新版本)。但如果更高版本的“deleted”列为true,则不应返回任何行 例如: |id |version |deleted | |0 |1 |false | |0 |2 |false | |1 |1 |false | |1 |2 |false | |1 |3 |true | 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
但是有更好的方法吗?我倾向于使用子查询:
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'
时,它才会返回版本最高的行。这可以通过使用row\u number()
功能来实现,方法是根据版本对行进行排序,选择版本最高的行,并使用WHERE
子句忽略WHEREdeleted 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
我同意:
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
我假设对
id
0的请求实际上应该返回第二行:0,2,false
。此外,如果第三个版本不存在,代码将为id
1返回两行。但是,您暗示您只需要一行。您使用的是什么RDBMS?这会影响答案。