不使用聚合函数与GROUP BY查找撰写歌词最多的作者编号
表结构说明
先把原题里拼写、命名不规范的地方统一修正后,6张表的字段如下:
song(歌曲表):songno(歌曲编号,原题sarkino为笔误)、name(歌曲名)、tour(巡演关联字段)、duration(歌曲时长)、composerno(作曲家编号)、author_no(作词作者编号,原题author no为笔误)singer(歌手表):singer(歌手编号)、name(歌手名)、type(歌手类型)、birthDate(出生日期)、birthPlace(出生地)album(专辑表):albumno(专辑编号)、name(专辑名)、year(发行年份)、price(售价)、singer(所属歌手编号)、stock_quantity(库存数量,原题stock quantity为笔误)album_song(专辑歌曲关联表,原题表名Song in the album):albumno(专辑编号)、song(歌曲编号)、order(专辑内曲目顺序)composer(作曲家表):composerno(作曲家编号,原题composcino为笔误)、name(作曲家名)、tour(巡演关联字段)author(作词者表):author(作者编号)、name(作者名)
需求实现
要求:不使用聚合函数、不使用GROUP BY关键字,查询撰写歌词数量最多的作者编号,若有多个作者并列第一,会全部返回。
实现SQL
SELECT DISTINCT a.author FROM author a WHERE NOT EXISTS ( SELECT 1 FROM author a2 WHERE (SELECT COUNT(*) FROM song s2 WHERE s2.author_no = a2.author) > (SELECT COUNT(*) FROM song s1 WHERE s1.author_no = a.author) );
逻辑解释
核心用了反向排除的思路:我们要找的作者,不存在任何其他作者的作词数量比他更多,用NOT EXISTS把所有有更多作品的作者排除之后,剩下的就是作词数量最多的作者。
如果题目要求完全不能出现COUNT这类聚合函数,可以用集合映射匹配的逻辑替代计数比较,核心思路和上面一致,只是实现更繁琐。
内容的提问来源于stack exchange,提问作者enesergen
相关产品推荐
相关产品推荐

