使用IN运算符的SQL嵌套子查询代码修正求助
修正你的嵌套子查询问题
嘿,我来帮你搞定这个可汗学院的SQL挑战!先拆解你第三、第四条语句里的问题,再给你针对性的修正方案:
先揪出错误根源
第三条语句的逻辑偏差
你写的代码:
SELECT name FROM artists WHERE genre IN ( SELECT title FROM songs WHERE artist = 'Queen');
这里犯了一个核心错误:子查询返回的是Queen的歌曲标题,但你却用它去匹配艺术家的genre(流派)——这俩完全不是同一类数据,IN运算符根本没法完成匹配,自然跑不出正确结果。
如果你的任务是找到所有和Queen同流派的艺术家,那应该先获取Queen的流派信息,再用这个流派去筛选艺术家,而不是拿歌曲标题凑数。
第四条语句的条件写错
你写的代码:
SELECT title FROM songs WHERE artist IN ( SELECT name FROM artists WHERE artist LIKE 'Pop');
这里的子查询条件明显搞错了!你要找的是Pop流派的艺术家,所以应该用genre LIKE 'Pop',而不是artist LIKE 'Pop'——artist字段存的是艺术家名字,用它匹配'Pop'根本找不到正确的艺术家列表。
修正后的可用代码
修正第三条语句(匹配Queen同流派艺术家)
如果任务允许直接从artists表获取流派,最简洁的写法是:
-- 先获取Queen的流派,再筛选同流派的所有艺术家 SELECT name FROM artists WHERE genre IN ( SELECT genre FROM artists WHERE name = 'Queen');
如果任务要求必须从songs表出发关联,也可以这么写:
SELECT name FROM artists WHERE genre IN ( SELECT genre FROM artists WHERE name = (SELECT artist FROM songs WHERE artist = 'Queen' LIMIT 1) );
修正第四条语句(获取Pop流派艺术家的所有歌曲)
如果是模糊匹配流派(比如包含Pop的流派名称):
SELECT title FROM songs WHERE artist IN ( SELECT name FROM artists WHERE genre LIKE 'Pop');
如果要求严格匹配'Pop'流派,把LIKE换成=即可:
SELECT title FROM songs WHERE artist IN ( SELECT name FROM artists WHERE genre = 'Pop');
小提示
写嵌套子查询时,一定要确保子查询返回的字段和外层查询用来匹配的字段类型、含义完全一致,不然IN运算符就是在做无效匹配哦!
内容的提问来源于stack exchange,提问作者Mengu902
相关产品推荐
相关产品推荐

