Sql 如何仅在符合条件的情况下检索具有最大值的行,否则不应返回任何内容

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”的对象。只应返回“版本”较高的行(最新版本)。但如果更高版本的“deleted”列为true,则不应返回任何行

例如:

|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
子句忽略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
我同意:

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?这会影响答案。