如何编写SQL查询选取年龄之和为60的两行数据?
问题描述
我的表数据如下:
id name age role --------------------------------------- 1 Rahul 20 1 2 Karan 35 0 3 Vivek 47 0 4 Shubham 40 1 5 Paras 87 1 6 Arjun 18 1 7 Ayush 28 0
我想要选取年龄之和等于60的两行数据,比如上表中的第1行(Rahul,20岁)和第4行(Shubham,40岁)。请问对应的SQL查询语句是什么?
我尝试了以下语句,但没有得到正确结果:
select * from form_data where age=(select age from form_data having sum(age)=60);
解决方案
你尝试的语句逻辑有误:having sum(age)=60是对全表年龄求和,全表年龄总和远大于60,且子查询返回的结果无法匹配外层的age=条件,自然得不到正确数据。
要找到年龄之和为60的两行数据,最直接的方法是用自连接,将表与自身关联,同时避免重复组合:
SELECT a.*, b.* FROM form_data a JOIN form_data b ON a.id < b.id WHERE a.age + b.age = 60;
这里a.id < b.id的作用是防止出现重复结果(比如同时返回a=1,b=4和a=4,b=1)。
如果只需要单独输出符合条件的每一行,不需要同时展示配对的两行信息,也可以用子查询实现:
SELECT * FROM form_data WHERE age IN ( SELECT 60 - age FROM form_data ) AND id NOT IN ( SELECT id FROM form_data WHERE age * 2 = 60 );
这段语句里的额外条件是为了排除年龄刚好为30的行——这类行的60 - age等于自身年龄,会导致自己和自己匹配,而我们需要的是两行不同的数据。
内容的提问来源于stack exchange,提问作者Ritesh Kumar
相关产品推荐
相关产品推荐

