我有一张这样的桌子:
Name Food
Tom |Ice Cream
Tom |Apple
Sam |Burger
Tom |Burger
Jim |Ice Cream
Sam |Ice Cream
我需要选择至少喜欢两种食物而不使用Count()
的孩子的名字,因此结果应类似于:
Name c
Tom |3
Sam |2
我们的大学老师说,我们应该通过将表本身乘以来尝试此操作,但是我找不到或提出解决方案。 该代码将与所需代码等效:
select name from (select name, count(*) as c from kids group by name) where c>1;
答案 0 :(得分:2)
这项工作可以吗?
declare @tempTable table (name varchar(max), food varchar(max))
insert into @tempTable select 'Tom', 'Ice Cream'
insert into @tempTable select 'Tom', 'Apple'
insert into @tempTable select 'Sam', 'Burger'
insert into @tempTable select 'Tom', 'Burger'
insert into @tempTable select 'Jim', 'Ice Cream'
insert into @tempTable select 'Sam', 'Ice Cream'
select t1.name, 0+SUM(1) from @tempTable t1 group by t1.name having SUM(1)>1
结果 名称(无列名) 山姆2 汤姆3
答案 1 :(得分:1)
另一种解决方案...
declare @tempTable table (name varchar(max), food varchar(max))
insert into @tempTable select 'Tom', 'Ice Cream'
insert into @tempTable select 'Tom', 'Apple'
insert into @tempTable select 'Sam', 'Burger'
insert into @tempTable select 'Tom', 'Burger'
insert into @tempTable select 'Jim', 'Ice Cream'
insert into @tempTable select 'Sam', 'Ice Cream'
select distinct t1.name from @tempTable t1 join @tempTable t2 on t2.name = t1.name and t2.name+t2.food <> t1.name+t1.food
这不会显示您的人数,因为我们没有count(*),但是会告诉您谁有多个。
答案 2 :(得分:0)
未经测试的SQL解决方案。
select a.name from kids a, kids b
where a.name = b.name and a.food != b.food
group by a.name;
不确定为什么您的教授强迫您写出次优的解决方案,但我想它会为您提供有关联接工作原理的见识。
最终解决方案已通过测试!
select distinct a.name from kids a, kids b
where a.name = b.name
and a.food != b.food;
答案 3 :(得分:0)
尝试这样的事情:
SELECT a1.name, 1 + SUM( 1 ) AS c
FROM kids AS a1 JOIN kids AS a2 ON a1.name = a2.name AND a1.food <> a2.food
GROUP BY a1.name
HAVING SUM( 1 ) > 0
答案 4 :(得分:0)
仅使用分组依据
select name ,count(*) from tab group by name
having count(*)>1
不需要任何子查询