【问题标题】:Improve SQL query by replacing inner query通过替换内部查询改进 SQL 查询
【发布时间】:2021-02-02 20:21:15
【问题描述】:

我正在尝试简化这个 SQL 查询(我用隐喻替换了真实的表名),主要是摆脱了内部查询,但我脑壳僵硬,想不出任何办法。

我的主要关注点(除了美观)是重负载下的性能

查询的目的是计算在保存图书的任何特定书架上找到的按类型分组的所有图书(因此内部查询有效地告诉了在哪个书架上计算图书)。

SELECT g.name, count(s.book_id) occurances FROM genre g
LEFT JOIN shelve s ON g.shelve_id=s.id
WHERE s.id=(SELECT genre_id FROM book WHERE id=111)
GROUP BY s.genre_id, g.name

【问题讨论】:

  • 您的查询应该没问题,尽管GROUP BY 中不需要s.genre_id。我也迷失了s.id = b.genre_id。样本数据和期望的结果将阐明您想要做什么。

标签: sql join select inner-query


【解决方案1】:

您似乎想知道书架上的许多书与第 111 本书属于同一类型:如果您喜欢书“X”,我们有很多类似的书。

我注意到的一件事是原始中的WHERE 子句需要shelve 表的值,从而有效地将其转换为INNER JOIN。说到 JOIN,你可以用 JOIN 代替嵌套选择。

SELECT g.name, count(s.book_id) occurances 
FROM genre g
INNER JOIN shelve s ON s.id = b.shelve_id
INNER JOIN book b on b.genre_id = s.id 
WHERE b.id=111
GROUP BY g.id, g.name

想多了,我也可能从book开始,而不是genre。最后,您需要genre 表的唯一原因是找到name,因此通过id 匹配它可能更有效。

SELECT g.name, count(s.book_id) occurances 
FROM book b 
INNER JOIN shelve s ON s.id = b.genre_id
INNER JOIN genre g on g.shelve_id = s.id
WHERE b.id=111
GROUP BY g.id, g.name

不确定它们是否符合您“更简单”的想法,但它们是替代品。

...除非将shelve.idbook.genre_id 匹配是问题中的错字。这两个表共享相同的id 值似乎很奇怪,在这种情况下,它们都是错误的。

【讨论】:

  • 从一个书架上存在一个流派的问题看来,一个书架可以容纳多个流派。他们必须有很大的架子......
猜你喜欢
  • 2011-11-30
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
  • 2012-06-18
  • 2015-07-07
  • 2020-05-08
相关资源
最近更新 更多