2011-10-28 54 views
3

我在表中有一些重复记录,因为事实证明Netezza不支持对主键进行约束检查。这就是说,我有一些记录,其中的信息是完全一样的,我想删除其中的一个。我试着做如何删除一条符合SQL中某些条件的记录? (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.This是Netezza公司

回答

3

如果它不支持任何“DELETE TOP 1”或“限制”的关键字,你可能最终不得不执行以下操作之一:

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

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

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

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

+0

这有助于。我不喜欢坏消息,但我想我不能责怪信使。谢谢。 – Rondel

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

+0

不会只是将重复项插入到新表中,然后将重复项插入到原始表中?我喜欢这个主意的基础知识 – Rondel

0

的GROUP BY 1,2,3,....,N将消除在插入件的愚弄到临时表

D.

3

的下面查询适用于DELE从表中复制。

DELETE FROM YOURTABLE 
WHERE COLNAME1='XYZ' AND 
(
COLNAME1, 
ROWID 
) 
NOT IN 
(
SELECT COLNAME1, 
     MAX(ROWID) 
FROM YOURTABLENAME 
WHERE COLNAME = 'XYZ' 
GROUP BY COLNAME1 
) 
1
-- remove duplicates from the <<TableName>> table 
    delete from <<TableName>> 
    where rowid not in 
    (
    select min(rowid) from <<TableName>> 
    group by (col1,col2,col3) 
); 
-1

是否ROWID的使用是允许在Netezza公司......据我所知是关心我不认为这个查询将在Netezza公司执行...

相关问题