Можем ли мы выполнять операции DML, такие как Delete, используя предложение Group by? - PullRequest
2 голосов
/ 17 апреля 2011

Можем ли мы выполнять операции DML, такие как Delete, используя предложение Group by в T-SQL?

Ответы [ 3 ]

4 голосов
/ 17 апреля 2011

оператор SELECT - http://msdn.microsoft.com/en-us/library/ms189499.aspx

УДАЛИТЬ оператор - http://msdn.microsoft.com/en-us/library/ms189835.aspx

Как видите, GROUP BY находится в SELECT, но не в DELETE, поэтому вы не можете использовать его напрямую. Это также не указано в операторе INSERT.

[ WITH <common_table_expression> [ ,...n ] ]  
DELETE   
    [ TOP ( expression ) [ PERCENT ] ]   
    [ FROM ]   
    { <object> | rowset_function_limited   
      [ WITH ( <table_hint_limited> [ ...n ] ) ]  
    }  
    [ <OUTPUT Clause> ]  
    [ FROM <table_source> [ ,...n ] ]   
    [ WHERE { <search_condition>   
            | { [ CURRENT OF   
                   { { [ GLOBAL ] cursor_name }   
                       | cursor_variable_name   
                   }   
                ]  
              }  
            }   
    ]   
    [ OPTION ( <Query Hint> [ ,...n ] ) ]   
[; ]  

Но, используя предложение WHERE или предложение, вы можете использовать GROUP BY, например

DELETE tbl
WHERE id NOT IN (select max(id) from tbl GROUP BY date_logged)

или

DELETE a
FROM tbl a
JOIN (select a_id from othertbl group by a_id having count(*) >= 3) b
    ON a.id = b.a_id
1 голос
/ 18 апреля 2011

Вы не можете использовать GROUP BY непосредственно в качестве цели DELETE, но вместо этого вы можете использовать PARTITION BY.

Это полезная альтернатива использованию GROUP BY и подзапросу для таких задач, как удаление дубликатов .

В сочетании с оконными агрегатными функциями это позволяет вам выполнять множество задач, которые может разрешить гипотетический DELETE ... GROUP BY.

например. Для следующей настройки

DECLARE @foo TABLE
(
col1 int,
col2 int
)
INSERT INTO @foo
SELECT 1,100 UNION ALL
SELECT 1,123 UNION ALL
SELECT 2,150 UNION ALL
SELECT 2,200

Это , а не действительный синтаксис

DELETE FROM @foo
GROUP BY col1
HAVING SUM(col2) > 300

Однако это

;WITH cte AS
(
SELECT SUM(col2) OVER (PARTITION BY col1) AS S 
FROM @foo
) 
DELETE FROM cte
WHERE S > 300
1 голос
/ 17 апреля 2011

Что вы пытаетесь

невозможно .................

вы можете сделать что-то вроде этого

DELETE FROM #Customers
WHERE ID IN 
( SELECT    MAX(ID) FROM #Customers
GROUP BY CustName, Pincode
HAVING COUNT(*) > 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...