Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.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 Postgres-仅当两个子查询产生结果时才返回查询结果_Sql_Postgresql - Fatal编程技术网

Sql Postgres-仅当两个子查询产生结果时才返回查询结果

Sql Postgres-仅当两个子查询产生结果时才返回查询结果,sql,postgresql,Sql,Postgresql,这是一张叫做水果的桌子: 我正在尝试从两个子查询创建一个查询。仅当两个子查询都返回任何结果时,主查询才应返回结果。因此,如果两个子查询中的任何一个子查询都没有任何结果,那么整个查询将不会返回任何结果 下面是我处理过的一个查询。这有点像我想要创造的: WITH r AS ( SELECT * FROM fruits WHERE fruit_name = ('pear') ) SELECT * FROM r UNION ALL SELECT * FROM fruits WHE

这是一张叫做水果的桌子:

我正在尝试从两个子查询创建一个查询。仅当两个子查询都返回任何结果时,主查询才应返回结果。因此,如果两个子查询中的任何一个子查询都没有任何结果,那么整个查询将不会返回任何结果

下面是我处理过的一个查询。这有点像我想要创造的:

WITH r AS (
    SELECT *
    FROM fruits
    WHERE fruit_name = ('pear')
)
SELECT *
FROM r
UNION ALL
SELECT *
FROM fruits
WHERE fruit_name = ('banana')
  AND EXISTS (
    SELECT *
    FROM r
  );
所以这个查询不会返回任何结果,因为第一个子查询要求一个“pear”,而水果表中没有“pear”。这是工作的预期


但是,如果我在查询中交换“pear”和“banana”,那么它将返回一行:“banana”行。这不是我想要的——在这个场景中,我也希望它什么都不返回

因此,基本上,我如何修改这个查询或使用更好的查询,使其仅在两个子查询都有结果时返回结果


SQL FIDLE:

您可以使用两个子查询,而不是一个子查询

WITH sub1 AS (
    SELECT *
    FROM fruits
    WHERE fruit_name = ('pear')
),
sub2 AS (
    SELECT *
    FROM fruits
    WHERE fruit_name = ('banana')
)
SELECT *
FROM sub1
UNION ALL
SELECT *
FROM sub2
WHERE
EXISTS (
    SELECT *
    FROM sub1
  )
AND EXISTS (
    SELECT *
    FROM sub2
  );


在where子句中使用两个检查:

select *
from fruits
where fruit_name in ('banana', 'pear')
and exists (
    select from fruits
    where fruit_name = 'banana')
and exists (
    select from fruits
    where fruit_name = 'pear');
请注意,在Postgres中,选择列表可能为空。可以选择列或常量

...
and exists (
    select id from fruits
    where fruit_name = 'banana')
...
但这并不影响结果

或者,您可以检查结果是否包含同时包含香蕉和梨的行:


可以使用单个子查询表示:

select f.*
from fruits f
where f.fruit_name in ('banana', 'pear') and
      exists (select 1
              from fruits f2
              where f2.fruit_name in ('banana', 'pear') and
                    f2.fruit_name <> f.fruit_name
             );

如果您确实有副本,但您的样本数据没有副本,则可以轻松调整此逻辑。

我不明白您希望通过此实现什么。但是,在第二个示例中,您得到了“香蕉”输出,因为您使用了SELECT*FROM r UNION ALL。。。!这将在每次执行第一个子查询时提供公共表表达式的所有结果。那就别提这个了!?无论出于什么原因,这个问题都明确提到它有两个子查询,只有在两个子查询产生结果时才返回查询结果。然而,如果我在查询中交换“pear”和“banana”,那么它将返回一行:“banana”行。这不是我想要的——在这个场景中,我也希望它什么都不返回。这正是您的示例中发生的情况!是的,这就是它的表现。XD虽然我同意在这种情况下,这比我的更有效、更简洁,但我不确定这是否是我们想要的。在我的理解中,查找在一个表上的事实是最小可复制示例的结果。
with results as (
    select *
    from fruits
    where fruit_name in ('banana', 'pear')
)
select *
from results
where (
    select count(distinct fruit_name)
    from results
    ) = 2
select f.*
from fruits f
where f.fruit_name in ('banana', 'pear') and
      exists (select 1
              from fruits f2
              where f2.fruit_name in ('banana', 'pear') and
                    f2.fruit_name <> f.fruit_name
             );
select f.*
from (select f.*, count(*) over () as cnt
      from fruits f
      where f.fruit_name in ('banana', 'pear')
     ) f
where cnt = 2;