如何删除与SQL中的某些条件匹配的一条记录? (Netezza公司)

时间:2011-10-28 17:55:07

标签: 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

有没有办法限制此查询删除的记录?我知道我可以删除记录并重新插入,但这有点单调乏味,因为我必须多次这样做。

请注意,这不是SQL Server或MySQL。这适用于Netezza

6 个答案:

答案 0 :(得分:3)

如果它不支持“DELETE TOP 1”或“LIMIT”关键字,您可能最终必须执行以下操作之一:

1)添加某种自动递增列(如ID),使每一行都是唯一的。不过,我不知道你是否可以在创建表之后在Netezza中做到这一点。

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

我希望有所帮助。请告诉我们。

以供将来参考;这就是为什么我个人总是创建一个自动递增的ID字段,即使我不认为我会使用它。 :)

答案 1 :(得分:3)

以下查询适用于从表中删除重复项。

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

答案 2 :(得分:1)

如果记录相同,那么您可以执行类似

的操作
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中自动找到欺骗

答案 3 :(得分:1)

  -- remove duplicates from the <<TableName>> table
  delete from <<TableName>> 
  where rowid not in 
  (
    select min(rowid) from <<TableName>>
    group by (col1,col2,col3) 
  );

答案 4 :(得分:0)

GROUP BY 1,2,3,....,n将消除插入到临时表中的欺骗

答案 5 :(得分:-1)

在Netezza中是否允许使用rowid ...据我所知,我不认为这个查询会在Netezza中执行...