t-sql - удалить только второе значение - PullRequest
1 голос
/ 08 декабря 2010

Я хотел бы запустить SQL-оператор, который удалит ТОЛЬКО второе значение, например

delete from table1 where condition1

Я хочу, чтобы этот оператор удалил ТОЛЬКО второе значение

как я могу это сделать?

Я хотел бы уточнить.у меня есть поле с именем field1, которое является автономным номером, и это первичный ключ, и он увеличивается.я хотел бы удалить запись, содержащую большее число

Ответы [ 4 ]

3 голосов
/ 09 декабря 2010

Вы также можете использовать функцию ROW_NUMBER() сервера SQL для нумерации каждой строки и использовать это число для выделения только второго элемента для удаления в соответствии с вашим собственным пользовательским порядком во внутреннем запросе over (ORDER BY <myKey> asc)). Это обеспечивает большую гибкость.

DELETE a FROM table1 
FROM table1 a 
JOIN (
        select ROW_NUMBER() over (ORDER BY <myKey> asc) as AutoNumber, <myKey> from table1
) b on a.<myKey> = b.<myKey>
WHERE condition1
AND b.AutoNumber = 2
1 голос
/ 09 декабря 2010

Вы хотите удалить только последний дубликат или все, кроме первого?

Для всех, кроме первого: ( Отредактировано для использования CTE в соответствии с предложением @ Мартина.)

with target as (select * from table1 where condition1)
delete from target goner
 where exists (select * from target keeper
                where keeper.field1 < goner.field1)

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

РЕДАКТИРОВАТЬ: Чтобы удалить только последнюю:

with target as (select * from table1 where condition1)
delete from target goner
 where exists (select * from target keeper
                where keeper.field1 < goner.field1)
   and not exists (select * from target missing
                    where missing.field1 > goner.field1)

Другими словами, если есть другая совпадающая запись с более низким полем1, И не существует совпадающей записи с более высоким полем1, то у нас будет самый высокий дубликат, поэтому уничтожьте его.

0 голосов
/ 09 декабря 2010

Прошло много времени (поэтому мой синтаксис не совсем верен), и это может быть не лучшим решением, но «академический» ответ будет примерно таким:

delete from table1 where condition1
and field1 = (select max(field1) from table1 where condition1)
0 голосов
/ 09 декабря 2010

Попробуйте:

DELETE MyTable 
FROM MyTable
LEFT OUTER JOIN (
   SELECT MIN(id) as id, Col1, Col2, Col3 
   FROM MyTable 
   GROUP BY Col1, Col2, Col3
) as KeepRows ON
   MyTable.id= KeepRows.id
WHERE
   KeepRows.RowId IS NULL

ОБНОВЛЕНИЕ

Хотя это может быть не так "красиво", как у @ Jeffrey's, оно работает.Из того, что я могу сказать, @ Джеффри нет.См. Sql ниже (Удалить вместо SELECT * для демонстрации):

WITH TEMP as
(
  SELECT 1 as id,'A' as a,'Z' as b
  UNION
  SELECT 2,'A','Z'
  UNION
  SELECT 3,'B','Z'
  UNION
  SELECT 4,'B','Z'
)

SELECT *
FROM TEMP
LEFT OUTER JOIN (
   SELECT MIN(id) as id, a, b
   FROM TEMP 
   GROUP BY a, b
) as KeepRows ON
   temp.id= KeepRows.id
WHERE
   KeepRows.id IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...