【问题标题】:Can't figure out whether I need to NEST or JOIN or something else?不知道我是否需要 NEST 或 JOIN 或其他什么?
【发布时间】:2019-07-17 11:58:14
【问题描述】:

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

我想运行一个查询,通过计算历史上预订 0 次航班的国家/地区数量,按 DESC 顺序对各大洲进行排名。但显示大洲名称而不是其 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)

【问题讨论】:

  • 提示:INNER JOIN.

标签: sql sql-server relational-database metabase


【解决方案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,那么这仍然会报告该国家/地区没有航班。但现在我离最初的问题太远了……

【讨论】:

    【解决方案2】:

    您可以使用联接或子查询来执行此操作

    使用连接

    您只需要加入基于 Cont_id 列的大陆表并获取大陆名称。

    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 
    

    【讨论】:

      猜你喜欢
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 2013-02-05
      • 1970-01-01
      相关资源
      最近更新 更多