我可能忽视了一些简单的事情,但我没有看到它 假设我有一个参与者和分数表
[Name] [Score]
Tom 12
Tom 14
Tom 20
Dick 14
Dick 17
Harry 23
我希望向所有参与过不止一次的人展示他们所有的分数。这意味着在这个例子中,我想显示除最后一个之外的所有记录
第一部分很简单 - 只需按名称分组并添加having count([Score])>1
。但那么如何显示所有分数呢?
我尝试过不进行分组和添加count([Score]) over (partition by [Name])
,但这不是一个有效的表达式来过滤。你不能(count([Score]) over (partition by [Name]))>1
。
所以最后我去了
SELECT * from [Table]
where [Name] in (
SELECT [Name] from [Table]
GROUP by [Name]
HAVING count([Score])>1
)
这是有效的,但我想知道是否有更好的方法
(真正的查询更长,涉及更多连接表,所有必须在内部选择内重复,所以这感觉......很脏。违反DRY原则。)
这是我能做的最好的事情吗?或者有更好的方法吗?
答案 0 :(得分:0)
是的,还有其他方法可以使用exists
代替in
select *
from table t
where exists (
select 1 from table
where name = t.name
group by name
having count(1) > 1
)
答案 1 :(得分:0)
你钉了很多。无法计算子查询中的重复名称,然后使用其结果过滤原始表。您可以使用IN
或EXISTS
,虽然它们略有不同(使用IN
时,如果至少有一个结果为NULL
,那么它将永远不会匹配!)。我宁愿改用EXIST
。
SELECT
T1.*
from
[Table] T1
where
EXISTS (
SELECT
'the name appears at least twice with not null score'
FROM
[table] T2
WHERE
T1.name = T2.name -- NULL names won't match here!
GROUP BY
T2.name
HAVING
COUNT(score) > 1)