2013-12-13 55 views
0

使用傳統的ASP和MS-SQL服務器2008聚合函數/分組依據 - 無效的列錯誤

我所試圖做的是選擇重複記錄,並指望他們這樣我就可以再更新的第一個和刪除休息。

我的查詢選擇重複確定,但只要我嘗試並引入計數,它會停止使用消息「列'calendar.id'在選擇列表中無效,因爲它不包含在聚合函數中或GROUP BY子句「。

我試圖重寫這個,並將計數添加到第二個SELECT並將該ID添加到GROUP BY(以及儘可能多的這種事物的組合,但我仍然可以得到錯誤。看着在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

@ Mihai - 它是calendar.id,沒有下劃線 –

+0

與問題評論無關:你的代碼可能(很可能)非常容易發生SQL注入攻擊。嘗試將其放入SP中並避免使用(無參數)動態查詢。 – jean

回答

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的我只是想強調的最後和第一線之間的鏈接)

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子句中包含這兩個字段。