如何在SQL中删除一条符合某些条件的记录?(内特扎)

如何在SQL中删除一条符合某些条件的记录?(内特扎),sql,netezza,Sql,Netezza,我在一个表中有一些重复的记录,因为事实证明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 有没有办

我在一个表中有一些重复的记录,因为事实证明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的。如果Netezza不支持DELETE TOP 1或LIMIT关键字,则可能需要执行以下操作之一:

1添加某种自动递增的列,如ID,使每一行都是唯一的。不过,我不知道在创建表之后是否可以在Netezza中执行此操作

2使用某种编程语言以编程方式读取整个表,以编程方式消除重复项,然后删除所有行并再次插入。如果它们是其他表的引用,则可能无法执行此操作,在这种情况下,您可能必须临时删除约束

我希望这有帮助。请让我们知道


并供日后参考;;这就是为什么我个人总是创建一个自动递增的ID字段,即使我认为我永远不会使用它

如果记录相同,那么您可以执行以下操作

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

您甚至可以创建一个子查询来选择COUNT*>1的所有测试ID,以便在步骤1和3中自动查找重复项。GROUP BY 1,2,3,…,n将消除插入临时表时的重复项。下面的查询用于从表中删除重复项

DELETE FROM YOURTABLE 
WHERE COLNAME1='XYZ' AND 
(
COLNAME1,
ROWID
)   
NOT IN
(
SELECT COLNAME1,
       MAX(ROWID)
FROM YOURTABLENAME
WHERE COLNAME = 'XYZ'
GROUP BY COLNAME1
)

Netezza中是否允许使用rowid…据我所知,我认为Netezza中不会执行此查询…

这很有帮助。我不喜欢这个坏消息,但我想我不能责怪那个信使。谢谢。这不就是将重复项插入新表,然后将重复项重新插入我的原始表吗?不过我喜欢这个想法的基础
  -- remove duplicates from the <<TableName>> table
  delete from <<TableName>> 
  where rowid not in 
  (
    select min(rowid) from <<TableName>>
    group by (col1,col2,col3) 
  );