Как удалить одну запись, соответствующую некоторым критериям в SQL? (Netezza) - PullRequest
3 голосов
/ 28 октября 2011

У меня есть несколько повторяющихся записей в таблице, потому что, как оказалось, Netezza не поддерживает проверки ограничений для первичных ключей.Тем не менее, у меня есть некоторые записи, где информация точно такая же, и я хочу удалить только одну из них.Я пытался сделать

delete  from table_name where test_id=2025 limit 1

, а также

delete  from table_name where test_id=2025 rowsetlimit 1

Однако ни один из вариантов не работает.Я получаю сообщение об ошибке

found 'limit'. Expecting a keyword

Можно ли ограничить записи, удаленные этим запросом?Я знаю, что могу просто удалить запись и вставить ее заново, но это немного утомительно, поскольку мне придется делать это несколько раз.

Обратите внимание, что это не SQL Server или MySQL.Netezza

Ответы [ 6 ]

3 голосов
/ 18 ноября 2011

Приведенный ниже запрос работает для удаления дубликатов из таблицы.

DELETE FROM YOURTABLE 
WHERE COLNAME1='XYZ' AND 
(
COLNAME1,
ROWID
)   
NOT IN
(
SELECT COLNAME1,
       MAX(ROWID)
FROM YOURTABLENAME
WHERE COLNAME = 'XYZ'
GROUP BY COLNAME1
)
3 голосов
/ 28 октября 2011

Если он не поддерживает ни «УДАЛИТЬ ТОП 1», ни ключевое слово «LIMIT», вам может потребоваться выполнить одно из следующих действий:

1) добавить некий вид автоинкрементного столбца (например, идентификаторов), делая каждую строку уникальной. Я не знаю, сможете ли вы сделать это в Netezza после того, как таблица будет создана.

2) Программно читать всю таблицу с использованием некоторого языка программирования, программно устранять дубликаты, затем удалять все строки и вставлять их снова. Это может быть невозможно, если они являются ссылками в других таблицах, и в этом случае вам может потребоваться временно удалить ограничение.

Надеюсь, это поможет. Пожалуйста, дайте нам знать.

И для дальнейшего использования; Вот почему я лично всегда создаю поле с автоматически увеличивающимся идентификатором, даже если я не думаю, что когда-либо буду его использовать. :)

1 голос
/ 20 мая 2012
  -- remove duplicates from the <<TableName>> table
  delete from <<TableName>> 
  where rowid not in 
  (
    select min(rowid) from <<TableName>>
    group by (col1,col2,col3) 
  );
1 голос
/ 29 октября 2011

Если записи идентичны, вы можете сделать что-то вроде

CREATE TABLE DUPES as
SELECT col11,col2,col3,col....... coln from source_table where test_id = 2025
group by 
1,2,3..... n

DELETE FROM source_table where test_id = 2025

INSERT INTO Source_table select * from duoes

DROP TABLE DUPES

Вы даже можете создать подзапрос, чтобы выбрать все test_ids HAVING COUNT (*)> 1, чтобы автоматически находить дубликаты в шагах1 и 3

0 голосов
/ 05 июня 2013

Разрешено ли использование rowid в Netezza ... Насколько я знаю, я не думаю, что этот запрос будет выполнен в Netezza ...

0 голосов
/ 13 ноября 2011

GROUP BY 1,2,3, ...., n устранит дубликаты на вставке во временную таблицу

...