首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SQL中编写多个子查询有更好的选择吗?

在SQL中编写多个子查询有更好的选择吗?
EN

Stack Overflow用户
提问于 2020-11-16 13:19:50
回答 1查看 247关注 0票数 1

我正在查询Redash,以提取一个带有定价网格的停车位的汇总列表。清单表由停车详细信息(姓名、地址、链接)和多个收费栏组成,视逗留时间而定。

我用两张桌子(公园和优惠)。优惠表有三个字段,park_id、价格和持续时间。每个park_id的价格可能对应于一定的停留时间。举个例子,公园#1将收取3600秒的2美元,86400秒的30美元等等。

我已经写了单独的子查询,以获得这些价格的每段时间,从1小时到24小时(1天),然后持续到31天,然后93天,186天和372天。总共有57个子查询。

结果表包含57列价格(price1h,price2h…)。.price1d,价格2d…。。price31d,price93d,price186d,price372d)。

条件:有两个重要的条件,我必须用它来得到价格。一个是offers.duration = 3600/7200等,然后我筛选哪些包类型而不是订阅类型的报价。最后,offers.park_id = parks.id将表中的两个关键字段链接起来。

问题是,我多次重复这个子查询的时间不同,执行非常缓慢,超过了“Redash查询执行时间限制”。

查询的一个片段如下:

代码语言:javascript
复制
SELECT DISTINCT parkid AS ID,
park_name AS Name,
park_address AS full_address,
park_url_description AS park_url,

      (SELECT offers.price
          FROM offers
          WHERE offers.type = 'package'
            AND offers.duration = 3600
            AND offers.park_id = park.parkid) AS price1h,
         
           (SELECT offers.price
           FROM offers
           WHERE offers.type = 'package'
           AND offers.duration = 7200
           AND offers.park_id = park.parkid) AS price2h,       

          (SELECT offers.price
          FROM offers
          WHERE offers.type = 'package'
          AND offers.duration = 10800
          AND offers.park_id = park.parkid) AS price3h,       
          …….. /* and so on */
FROM park
LEFT JOIN offers ON park.parkid = offers.park_id
GROUP BY id, Name, full_address, park_url

结果表如下所示:https://i.stack.imgur.com/0opp0.png

有人能提出一个更好的选择来获得这些价格吗?我试过使用CTE方法,但是我没有足够的经验,所以我无法想出一个解决方案(我是一个实习生,还在学习)。提前谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-16 14:16:21

假设每个park+duration都有一个报价,则可以通过有条件地使用聚合函数来完成:

代码语言:javascript
复制
SELECT 
  p.parkid AS ID,
  p.park_name AS Name,
  p.park_address AS full_address,
  p.park_url_description AS park_url,
  max(if (o.duration = 3600, o.price, null)) as price1h,
  max(if (o.duration = 7200, o.price, null)) as price2h,
  max(if (o.duration = 10800, o.price, null)) as price3h
FROM park p
  LEFT JOIN offers o ON p.parkid = o.park_id and o.type = 'package'
  AND o.duration in (3600, 7200, 10800)
GROUP BY p.parkid, p.park_name, p.park_address, p.park_url_description

请参阅[医]小提琴

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64858762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档