2013-12-13 4 views
0

Использования классического ASP и MS-SQL Server 2008Агрегатная функция/Group By - недопустимый колонок

То, что я пытаюсь сделать, это выбрать повторяющиеся записи, и сосчитать их, так что я могу затем обновить первую и удалить отдых.

Мой запрос выбирает дубликаты ОК, но как только я попытаюсь ввести счетчик, он перестает работать с сообщением «Столбец« calendar.id »недействителен в списке выбора, потому что он не содержится ни в агрегатной функции, ни в предложение GROUP BY. "

Я попытался переписать это и добавил счет ко второй SELECT и добавив id в GROUP BY (и столько же комбинаций такого типа, как я могу думать, но я все еще получаю ошибки. посмотрел на stackoverflow для решения, похоже, немного сложный и не совсем применимый (или я не ищу подходящую вещь)

Где я иду не так? (также это лучший способ искать и редактировать дубликаты в виде таблицы небольшом (200к строк?)

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.

Если сам идентификатор является ключом для определения уникальности, вы можете изменить ваш запрос

SELECT id, COUNT(id) AS RecCount FROM calendar group by id having count(id) > 1 

, если вопросы, даты для фильтрации подмножество данных, например, для поиска только в определенный период, вы можете включить его в предложение WHERE. С другой стороны, если дата и идентификатор вместе определяют уникальность, вам нужно будет включить оба поля в предложение GROUP BY.

Смежные вопросы