Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 DELETE c группировкой  [new]
SergeV
Member

Откуда:
Сообщений: 144
Помогите пожалуйста понять, что не так в запросе:

Нужно удалить в каждой группе все записи, кроме одной, которая удовлетворяет условию max(pk_ZanTEMP):

DELETE Zanat
WHERE
(SELECT count(fkZANID) FROM Zanat Z WHERE Zanat.fkZANID=Z.fkZANID) > 1
GROUP BY fkZANID,pk_ZanTEMP
HAVING pk_ZanTEMP  NOT  in
(select max(pk_ZanTEMP) from Zanat WHERE
 (SELECT count(fkZANID) FROM Zanat Z WHERE Zanat.fkZANID=Z.fkZANID) > 1
 GROUP BY fkZANID
)

При запуске - ошибка "Неправильный синтаксис около ключевого слова 'GROUP'"

Аналогичный SELECT работает без ошибок:

select fkZANID from Zanat
WHERE
(SELECT count(fkZANID) FROM Zanat Z WHERE Zanat.fkZANID=Z.fkZANID) > 1
GROUP BY fkZANID,pk_ZanTEMP
HAVING pk_ZanTEMP  NOT  in
(select max(pk_ZanTEMP) from Zanat WHERE
 (SELECT count(fkZANID) FROM Zanat Z WHERE Zanat.fkZANID=Z.fkZANID) > 1
 GROUP BY fkZANID
)

Где ошибка ?
12 апр 10, 14:45    [8616266]     Ответить | Цитировать Сообщить модератору
 Re: DELETE c группировкой  [new]
наутилус
Member

Откуда: Украина
Сообщений: 1076
SergeV,

delete from Zanat where fkZANID in (
select fkZANID from Zanat
WHERE
(SELECT count(fkZANID) FROM Zanat Z WHERE Zanat.fkZANID=Z.fkZANID) > 1
GROUP BY fkZANID,pk_ZanTEMP
HAVING pk_ZanTEMP  NOT  in
(select max(pk_ZanTEMP) from Zanat WHERE
 (SELECT count(fkZANID) FROM Zanat Z WHERE Zanat.fkZANID=Z.fkZANID) > 1
 GROUP BY fkZANID
))
12 апр 10, 14:55    [8616350]     Ответить | Цитировать Сообщить модератору
 Re: DELETE c группировкой  [new]
Glory
Member

Откуда: Estonia
Сообщений: 96132
DELETE FROM a
FROM Zanat a INNER JOIN Zanat Z ON a.fkZANID=Z.fkZANID AND a.pk_ZanTEMP < z.pk_ZanTEMP 
12 апр 10, 14:56    [8616352]     Ответить | Цитировать Сообщить модератору
 Re: DELETE c группировкой  [new]
SergeV
Member

Откуда:
Сообщений: 144
Спасибо большое
12 апр 10, 16:25    [8617130]     Ответить | Цитировать Сообщить модератору
 Re: DELETE c группировкой  [new]
SergeV
Member

Откуда:
Сообщений: 144
наутилус,

Все-таки осталось непонятным, в чем принципиальное различие этих вариантов написания
DELETE from Zanat where fkZANID in (...)
и
DELETE Zanat ... 

Почему не работает второй, ведь в условии отбора то же самое. Это особенность синтаксиса SQL или другая причина?
15 апр 10, 17:36    [8635915]     Ответить | Цитировать Сообщить модератору
 Re: DELETE c группировкой  [new]
iljy
Member

Откуда:
Сообщений: 8083
SergeV,

это "особенность" оперетора DELETE - в нем нет предложений GROUP BY и HAVING. И это подробнейшим образом описано в документации.
15 апр 10, 17:44    [8635981]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить
 
Лучший учебный центр Microsoft!
Новейшие курсы Microsoft SQL Server 2014!
Статус Academy Oracle. Очень привлекательные цены на курсы Oracle!
Отсрочка платежа или скидка 5% на комплексные программы!