4

我在表中有一些重复记录,因为事实证明 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

4

6 回答 6

4

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

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

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

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

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

于 2011-10-28T18:10:35.160 回答
3

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

DELETE FROM YOURTABLE 
WHERE COLNAME1='XYZ' AND 
(
COLNAME1,
ROWID
)   
NOT IN
(
SELECT COLNAME1,
       MAX(ROWID)
FROM YOURTABLENAME
WHERE COLNAME = 'XYZ'
GROUP BY COLNAME1
)
于 2011-11-17T21:44:26.047 回答
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 中的骗子

于 2011-10-29T10:08:33.447 回答
1
  -- remove duplicates from the <<TableName>> table
  delete from <<TableName>> 
  where rowid not in 
  (
    select min(rowid) from <<TableName>>
    group by (col1,col2,col3) 
  );
于 2012-05-20T16:15:21.507 回答
0

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

于 2011-11-13T11:24:41.547 回答
-1

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

于 2013-06-05T07:02:06.293 回答