基于同一表中的另一行检索行的SQL查询
我有一个表基于同一表中的另一行检索行的SQL查询,sql,postgresql,Sql,Postgresql,我有一个表status,其中包含id、name和parent\u id列 我想检索父id为9的行 如果没有这样的行,我想得到id=9的行 我可以通过单个查询获得此信息吗?您可以选择两行,在顶部排序父id,然后抓取最上面的一行: select * from statuses where parent_id = 9 or id = 9 order by case when parent_id = 9 then 1 else 2 end limit 1 如果id不是主
status
,其中包含id
、name
和parent\u id
列
我想检索父id为9的行
如果没有这样的行,我想得到id=9的行
我可以通过单个查询获得此信息吗?您可以选择两行,在顶部排序父id,然后抓取最上面的一行:
select *
from statuses
where parent_id = 9 or id = 9
order by
case when parent_id = 9 then 1 else 2 end
limit 1
如果id
不是主键,您可以尝试使用union
,其中只有在前半部分为空时才执行后半部分:
select *
from statuses
where parent_id = 9
union all
select *
from statuses
where id = 9
and not exists
(
select *
from statuses
where parent_id = 9
)
@Andomar的任何一个答案都会起作用。只要确保在填充表后使用,就可以确定哪一个速度更快。事实上,如果你能更新你的帖子,结果会更快,那就太好了
选择版本()李>
从状态中选择计数(*)李>
EXPLAIN ANALYZE${QUERY}的最后一行李>
更简单、更快:
SELECT * FROM COALESCE(
(SELECT s FROM statuses s WHERE parent_id = 9 LIMIT 1)
,(SELECT s FROM statuses s WHERE id = 9 LIMIT 1)
)
如果不存在任何ID,此查询将返回一行类型为status
的值,其中填充了NULL
值,而此处的其他解决方案目前不返回任何行。因为这就是你打电话时发生的事
从空::状态中选择*
解释
COALESCE
本身无法对行进行操作,替换变量的子查询只能返回一列。如果您尝试:
SELECT COALESCE(
(SELECT * FROM statuses WHERE parent_id = 9 LIMIT 1)
,(SELECT * FROM statuses WHERE id = 9 LIMIT 1)
)
。。在没有索引的表上,这可能更快。实际上,我认为,您可以将两者结合起来,以获得第三个解决方案,其中如下所示:其中parent_id=9或id=9且不存在(…)
(我假设和的优先级高于PostgreSQL中的或。没有ISNULL()
在PostgreSQL中,使用标准的COALESCE()
。这假设如果存在一个parent_id=9
的行,则存在一个id=9
的行,这是有意义的,但这里没有定义。同样,问题要求返回“一行”,这个答案返回一组ID。
SELECT * FROM COALESCE(
(SELECT s FROM statuses s WHERE parent_id = 9 LIMIT 1)
,(SELECT s FROM statuses s WHERE id = 9 LIMIT 1)
)
SELECT COALESCE(
(SELECT * FROM statuses WHERE parent_id = 9 LIMIT 1)
,(SELECT * FROM statuses WHERE id = 9 LIMIT 1)
)
SELECT *
FROM statuses
WHERE parent_id = 9 OR id = 9
ORDER BY (id <> 9);