2011-10-28 77 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公司執行...

相關問題