【发布时间】:2019-06-19 13:25:11
【问题描述】:
这是一个名为fruits的表:
id fruit_name quantity date
1 | 'apple' | 10 | '2019-01-01'
2 | 'peach' | 15 | '2019-01-02'
3 | 'plum' | 5 | '2019-01-05'
4 | 'banana' | 10 | '2019-01-06'
5 | 'orange' | 20 | '2019-01-06'
6 | 'grape' | 25 | '2019-01-09'
我正在尝试从两个子查询创建一个查询。只有both两个子查询都返回任何结果时,主查询才应返回结果。因此,如果两个子查询中的任何一个都没有任何结果,那么整个查询应该什么都不返回。
以下是我处理过的查询。它有点像我想要创造的东西:
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',而fruits 表中没有'pear'。这按预期工作。
但是,如果我在查询中交换“梨”和“香蕉”,那么它将返回一行:“香蕉”行。这不是我想要发生的——在这种情况下,我也希望它返回 nothing。
所以基本上,我怎样才能修改这个查询(或使用更好的查询),以便它只返回结果如果两个子查询中的每一个每个都有结果?
【问题讨论】:
-
我不明白你想用这个实现什么。但是,您在第二个示例中得到了“香蕉”输出,因为您使用了
SELECT * FROM r UNION ALL ...!这每次都会为您提供来自公用表表达式(您的第一个子查询)的所有结果。所以就不要管它了!?
标签: sql postgresql