如何修改我的having子句,以便我的查询将显示我想要的结果

问题描述 投票:0回答:1

因此,目前我的查询显示了基于该大陆的国家/地区的所有“首选”旅行目的地的结果,并且我添加了一个having 子句来显示具有超过 1 个首选目的地的大陆。但是当我添加更多想要显示的列(比如说城市)时,我的查询什么也没有返回。

这是有效的查询,它显示有超过 2 个首选国家作为旅行目的地的所有大洲(首选标志是 Y)。

select  d.continent,d.country_name,di.is_preferred, count(1)
from continent c, countries ct
where c.cid = ct.id
and ct.preferred = Y
group by   d.continent,d.country_name,ct.is_preferred
having count(1) > 1
order by d.country_name asc;`

假设我想要显示相同的结果,但我想显示该大陆有超过 1 个首选国家/地区的国家/地区的所有城市列表。城市列来自C洲表,我一添加到having语句中,结果就是空白?

我做错了什么?

这是我修改后的查询:

select  d.continent,d.country_name,di.is_preferred, c.cities, count(1)
from continent c, countries ct
where c.cid = ct.id
and ct.preferred = Y
group by   d.continent,d.country_name,ct.is_preferred, c.cities
having count(1) > 1
order by d.country_name asc;

我尝试修改我的查询,但结果中没有任何结果

sql oracle group-by having
1个回答
0
投票

您在 SQL 查询中遇到的问题是由

GROUP BY
子句及其与
HAVING
子句的交互引起的。
GROUP BY
子句定义数据的聚合方式,并且
HAVING
子句过滤这些组。当您将具有高粒度级别的列(例如
cities
)添加到
GROUP BY
子句时,它会更改数据的分组方式,可能会创建许多小组,每个小组可能不满足
HAVING
计数条件.

在原始查询中,您按

continent
country_name
is_preferred
进行分组,这为您提供了每个大陆内的国家/地区组。当您将
cities
添加到此分组时,它会将这些组进一步细分为各个城市,可能会导致每个组的计数为 1,因此不满足
HAVING count(1) > 1
条件。

要实现列出具有多个首选国家/地区的大洲城市的目标,您可以使用子查询。这是一个方法:

  1. 首先,在子查询中识别具有多个首选国家/地区的大洲。
  2. 然后,将此结果与这些洲的城市连接起来。

以下是修改查询的方法:

SELECT c.continent, ct.country_name, ct.is_preferred, c.cities
FROM continent c
JOIN countries ct ON c.cid = ct.id
WHERE ct.is_preferred = 'Y'
AND c.continent IN (
    SELECT d.continent
    FROM continent d
    JOIN countries di ON d.cid = di.id
    WHERE di.is_preferred = 'Y'
    GROUP BY d.continent
    HAVING COUNT(DISTINCT di.country_name) > 1
)
ORDER BY ct.country_name ASC;

说明:

  • WHERE
    子句中的子查询选择具有多个首选国家/地区的大陆。
  • 主查询然后从这些大陆中选择城市,以及国家和大陆的详细信息。
  • JOIN
    用于根据国家/地区 ID 链接
    continent
    countries
    表。
  • 请注意,我将
    ct.preferred = Y
    更改为
    ct.is_preferred = 'Y'
    ,假设
    is_preferred
    是正确的列名称,“Y”是字符串值。

此查询应返回具有多个首选国家/地区的大洲城市列表,以及相关国家/地区和大洲的详细信息。

© www.soinside.com 2019 - 2024. All rights reserved.