无法确定我是否需要嵌套或加入?

时间:2019-07-17 11:58:14

标签: sql sql-server relational-database metabase

我有3张桌子-大洲,国家/地区信息和航班。

我想运行一个查询,通过计算过去预订过0个航班的国家数量来按DESC顺序对各大洲进行排名。但是显示大洲的NAME而不是其ID

大陆表-cont_id(P-KEY),名称为varchar,注释为varchar

国家/地区表-cntry_id(P-KEY),名称为varchar,缩写为varchar

航班信息表-cntry_id int,cont_id int,航班浮动,日期日期

我正在Metabase上进行操作,到目前为止,除了显示大洲名称外,我已经设法使它完成所有工作,仅显示其ID。我尝试过嵌套主查询,并尝试使用联接,但是都没有用

SELECT "public"."flights_info"."cont_id", count(*) AS "count"
FROM "public"."flights_info"
WHERE "public"."flights_info"."flights" <= 0
GROUP BY "public"."flights_info"."cont_id"
ORDER BY "count" DESC

我已经成功获取了cont_id,我只需要一行代码即可使其从大洲表中运行并为我提供与ID匹配的名称(我只希望这些名称不显示ID)< / p>

2 个答案:

答案 0 :(得分:1)

因此,简单的答案是进行查询,将其重新格式化一下,然后向大洲表中添加INNER JOIN。这样的事情可能会起作用:

SELECT 
    c.[name] AS continent_name,
    COUNT(*) AS [count]
FROM 
    [public].flights_info f
    INNER JOIN [public].continents c ON c.cont_id = f.cont_id
WHERE 
    f.flights <= 0
GROUP BY 
    c.[name]
ORDER BY 
    2 DESC;

但是,我不确定您的原始查询是正确的。您说过,您想计算每个大洲的国家数,而历史上没有预订任何航班,我也不认为这是您要计算的。取而代之的是,您计算的是航班数量为0或小于零的每个洲的行数。现在,也许这实际上就是数据库的工作方式,如果是这样的话,那么很酷,上面的查询应该使您进入正确的轨道。

但是,如果该数据库能够像我认为的那样工作,那么您将需要一个非常不同的查询,例如这个:

SELECT 
    c.[name] AS continent_name,
    COUNT(DISTINCT cn.cntry_id) AS [count]
FROM 
    [public].continents c
    INNER JOIN [public].country cn ON cn.cont_id = c.cont_id
    LEFT JOIN [public].flights_info f ON f.cont_id = c.cont_id AND f.cntry_id = cn.cntry_id
WHERE 
    ISNULL(f.flights, 0) <= 0
GROUP BY 
    c.[name]
ORDER BY 
    2 DESC;

这是如何工作的?好吧,它从大洲表开始,然后将其链接到国家,以获得每个大洲的国家列表。然后,它对广告投放表执行LEFT JOIN,因此即使没有广告投放数据也将获得匹配。最后,它计算出航班值等于或小于0或根本没有航班数据的国家/地区的数量。

即使这可能也不正确,就好像您为一个国家/地区设置了两行(我假设航班表针对每个大洲,国家/地区和日期都设置了一行),其中一个航班数= 0且一个人的航班数= 10,那么这仍然会报告该国家/地区没有航班。但是,现在我与原来的问题距离太远了……

答案 1 :(得分:0)

  

您可以使用联接或子查询来完成

使用JOIN

您只需要与基于Continents表的cont_id列连接并获取Continents名称。

select Continents.name, count(*) AS "count"
FROM flights_info  flights_info
join Continents Continents 
on Continents.cont_id = flights_info.cont_id
WHERE flights_info.flights <= 0
GROUP BY flights_info.cont_id,Continents.name
ORDER BY "count" DESC 

使用子查询

您可以编写另一个查询,通过匹配cont_id为您提供大陆名称。

select (select Continents.name from Continents Continents where Continents.cont_id =                 
flights_info.cont_id ) Continent_name, count(*) AS "count"
FROM flights_info  flights_info
WHERE flights_info.flights <= 0
GROUP BY flights_info.cont_id
ORDER BY "count" DESC