Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于同一表中的另一行检索行的SQL查询_Sql_Postgresql - Fatal编程技术网

基于同一表中的另一行检索行的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);