首页 新闻 会员 周边 捐助

提问个奇怪的sql

0
悬赏园豆:200 [已解决问题] 解决于 2013-05-22 12:02

话不多说直接上测试代码:

create table persontest
(
name nvarchar(10),
age int
)

insert into persontest
(name, age)
values
('a',3),
('a',3),
('b',4),
('b', 3)

以上sql跑完了之后你应该能得到大概这么一个表:

name age
a 3
a 3
b 4
b 3

现在我要进行类似这么一个查找(该sql肯定是不能跑的, 我只是用它来表达我想要做的查询)


select name, age
from persontest
group by name
having all age = 3

 

我期待的结果是:

(a,3), 或者能直接查出(a)也是可以接受的。

 

因为对于a来说, 所有的a的age都是3,因此a符合条件, 我要a了

b的话, 有一个4, 所以不全是3, 因此b不合格。b被踢掉了。

 

就是这么个需求。

 

由于聚合函数里我没找到类似于"all"这样的函数, 所以弄不清这个到底如何写。

有谁有办法吗?非常感谢。 圆豆不是问题。

补充:数据库是sql server

undefined的主页 undefined | 小虾三级 | 园豆:898
提问于:2013-05-22 11:42
< >
分享
最佳答案
1

select name from (
select name,age
from persontest
group by name,age) as n
group by name
having COUNT(1)=1

 

你是要找 name分组后,所有age都相同的么.?

收获园豆:200
只会造轮子 | 老鸟四级 |园豆:2274 | 2013-05-22 11:51

好像可以啊

小AI | 园豆:354 (菜鸟二级) | 2013-05-22 11:59

很接近了。 根据你的sql我写出来我要的了。

灰常感谢, 就你了。

undefined | 园豆:898 (小虾三级) | 2013-05-22 12:01

@undefined: 你妹,给我给点疯

小AI | 园豆:354 (菜鸟二级) | 2013-05-22 12:02

@小AI: 谁叫你答不出。 咱问问题就是这么干脆利索,不拖泥带水。

undefined | 园豆:898 (小虾三级) | 2013-05-22 12:04

@undefined: 

擦,这么麻利?我还没赚分呢!结贴!我准备顶回答问题的大屁股呢!

Beyond-bit | 园豆:2885 (老鸟四级) | 2013-05-22 12:13
其他回答(6)
1

你的意思是要找所有age=3且没有age<>3的name是吗?

I,Robot | 园豆:9783 (大侠五级) | 2013-05-22 11:47

试试select name from persontest p where age = 3 and not exists(select name from persontest where p.name = persontest.name and age <> 3)

支持(0) 反对(0) I,Robot | 园豆:9783 (大侠五级) | 2013-05-22 11:56

虽然没读懂你的话, 但是我感觉你说的应该就是我的意思。 

比如全天下叫张三的人今年都3岁, 那就显示张三

而全天下叫李四的人, 有三岁的有四岁的, 不显示李四。 

全天下叫王五的人, 全都不是三岁的, 不显示王五。

支持(0) 反对(0) undefined | 园豆:898 (小虾三级) | 2013-05-22 11:57
0

太难了。。

小AI | 园豆:354 (菜鸟二级) | 2013-05-22 11:59
0

顶一下

阿磊ing | 园豆:2 (初学一级) | 2013-05-22 12:04
0

select  name , min(age) from persontest group by name   having min(age)=max(age)

红泥 | 园豆:262 (菜鸟二级) | 2013-05-22 12:08
0

select name ,age, COUNT(*) AS num

from persontest

group by name,age

having age= 2

赵小猫 | 园豆:102 (初学一级) | 2013-05-22 12:09
0

按照你的问题题意,下列sql也能查出a

/*反向求解*/
select distinct name from personTest as a
where a.name not in (select distinct name from personTest where age!='3')
/*正向求解*/
select distinct name from personTest as a
where 3 = all(select b.age from personTest as b where a.name = b.name)

icyme | 园豆:77 (初学一级) | 2013-05-22 12:16
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册