【问题标题】:Return only one row of a select that would return a set of rows仅返回将返回一组行的选择的一行
【发布时间】:2013-08-12 09:44:15
【问题描述】:

我有一张这样的桌子:

create table myTab(
  id integer primary key,
  is_available boolean not null default true
);

我需要执行一个查询,只返回第一个遇到的将is_available 设置为 false 的行。

【问题讨论】:

  • 按is_available过滤,如果id表示第一个条目,则按id排序,然后只取第一个元素。
  • 太基础了。只需阅读the manual about SELECT

标签: sql postgresql sql-limit


【解决方案1】:

类似

select *
from myTab
where not is_available
order by id asc
limit 1

【讨论】:

  • 与其他一些 RDBMS 不同,Postgres 具有正确的 boolean 类型。请改用is_available = FALSENOT is_available
  • 感谢@ErwinBrandstetter,很明显PostgreSQL不是我最擅长的。 DB :) 但我非常喜欢它
【解决方案2】:

试试这个..

select id,is_available from myTab
where is_available = false
order by id asc
limit 1

如果你想要最后插入的行,那么就用这个 ..

    select id,is_available from myTab
    where is_available = false
    order by id desc
    limit 1

【讨论】:

  • 在我的情况下,按 id 排序并不是一个糟糕的解决方案,因为我的查询中涉及的 id 字段是表中包含的所有 id 的子集(我在 WHERE 上还有另一个子句)
【解决方案3】:

或者,您可以使用NOT EXISTS 查找 first 元组,在大多数情况下,这也是最快的解决方案:

SELECT *
FROM myTab mt
WHERE mt.is_available = False
AND NOT EXISTS (
    SELECT *
    FROM myTab nx
    WHERE nx.is_available = False
    AND nx.id < mt.id
    );

【讨论】:

    猜你喜欢
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    • 2017-07-09
    相关资源
    最近更新 更多