使用经典ASP和MS-SQL server 2008
我要做的是选择重复记录,并对它们进行计数,以便我可以更新第一个并删除其余记录。
我的查询选择重复项OK但是当我尝试引入计数时它会停止使用消息“列'calendar.id'在选择列表中无效,因为它不包含在聚合函数或者GROUP BY子句。“
我试图重写这个并将计数添加到第二个SELECT并将id添加到GROUP BY(以及我能想到的这种事情的多种组合,但我仍然会遇到错误。我看到了答案at stackoverflow上的解决方案似乎有点复杂而且不太适用(或者我不是在寻找合适的东西)
我在哪里错了? (这也是在一个小表中查找和编辑重复项的最佳方法(200k行?)
Dim strSQL_dup, rsSQL_dup, SQL_dupRecords, RecCount
strSQL_dup = "SELECT id, COUNT(id) AS RecCount FROM calendar WHERE start_date IN ( SELECT start_date FROM calendar WHERE pId = '" & pId & "' GROUP BY start_date HAVING (COUNT(start_date ) > 1) ) "
Set rsSQL_dup = conn.Execute(strSQL_dup)
While Not rsSQL_dup.EOF
If RecCount = 1 Then
'will eventually update the row
response.write(rsSQL_dup("id")) ' id of first'
Else
'will eventually delete the other rows
response.write(rsSQL_dup("id")) ' id of subsiquet rows
End If
rsSQL_dup.MoveNext
Wend
答案 0 :(得分:1)
问题是COUNT是一个聚合函数,因此传递给它的任何参数都需要在GROUP BY子句中。
如果id本身是您确定唯一性的关键,则可以将查询更改为
SELECT id, COUNT(id) AS RecCount FROM calendar group by id having count(id) > 1
如果日期对过滤您的数据子集很重要,例如要仅在特定时间段内搜索,可以将其包含在WHERE子句中。另一方面,如果date和id一起确定唯一性,则需要在GROUP BY子句中包含这两个字段。
答案 1 :(得分:1)
您似乎在主查询中缺少GROUP BY:
SELECT id, COUNT(id) AS RecCount
FROM calendar
WHERE start_date IN (SELECT start_date FROM calendar
WHERE pId = '" & pId & "'
GROUP BY start_date
HAVING (COUNT(start_date ) > 1) )
GROUP BY clalendar.id
(最后一行当然可以是GROUP BY id
我只想强调最后一行和第一行之间的联系)