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