УДАЛИТЬ, если возвращено более 1 MS SQL - PullRequest
0 голосов
/ 25 сентября 2019

Мне нужно удалить строки, если их больше 1. Почему это не работает?

if
    (SELECT count(*)
FROM Table1 where Name = 'TEST')

RETURN (2)

BEGIN
    DELETE MIN(Id) FROM Table1 where Name = 'TEST'
END

Ответы [ 3 ]

1 голос
/ 25 сентября 2019

Полагаю, столбец id, если первичный ключ.Таким образом, будет не более 1 записи для каждого идентификатора.Кроме того, не будет более 2 записей с одинаковым именем.

Прежде всего, вам необходимо определить дублированные записи (2 записи с одинаковым именем).
Это можно сделать так:this:

SELECT   Name,
         COUNT(*)
FROM     Table1
GROUP BY Name
HAVING   COUNT(*) = 2

Затем получите для каждой пары по одному с наименьшим идентификатором (внутренний запрос тот, который я показал выше):

SELECT   Name,
         MIN(id) AS min_id
FROM     Table1
WHERE    Name IN (SELECT Name
                  FROM   (SELECT   Name,
                                   COUNT(*)
                          FROM     Table1
                          GROUP BY Name
                          HAVING   COUNT(*) = 2
                         )
                 )
GROUP BY Name

Наконец, удалите нужные записи:

DELETE
FROM   Table1
WHERE  id IN (SELECT min_id
              FROM   (SELECT   Name,
                               MIN(id) AS min_id
                      FROM     Table1
                      WHERE    Name IN (SELECT Name
                                        FROM   (SELECT   Name,
                                                         COUNT(*)
                                                FROM     Table1
                                                GROUP BY Name
                                                HAVING   COUNT(*) = 2
                                               )
                                       )
                      GROUP BY Name
                     )
             )
0 голосов
/ 25 сентября 2019

Другое решение, как показано ниже.
Удаляет все записи, для которых существует еще одна запись с таким же именем и более высоким идентификатором:

DELETE
FROM   Table1 tab1
WHERE  EXISTS (SELECT *
               FROM   Table1 tab2
               WHERE  tab1.Name = tab2.Name
                 AND  tab2.id > tab1.id);

Она работает в Oracle.Не уверен для SQL-Server.

0 голосов
/ 25 сентября 2019

Ваш синтаксис неверен.Вы не удаляете из выражения;Вы удаляете из таблицы.

Вы можете использовать оконные функции и обновляемые CTE, чтобы делать то, что вы хотите.Если вы хотите удалить все копии строки, используйте count(*):

with todelete as (
      select t1.*,
             count(*) over (partition by t1.name) as cnt
      from table1 t1
      where Name = 'TEST'
     )
delete from todelete
    where cnt > 1;

Я предполагаю, что вы действительно хотите сохранить строку сминимальный идентификаторВ этом случае используйте row_number():

with todelete as (
      select t1.*,
             row_number() over (partition by t1.name order by t1.id) as seqnum
      from table1 t1
      where Name = 'TEST'
     )
delete from todelete
    where seqnum > 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...