我正在使用oracle数据库,并试图从中删除重复的记录。同样,我编写了下面的查询,但出现此错误
SQL Error: ORA-00933: SQL command not properly ended
00933. 00000 - "SQL command not properly ended"
在查询的outer
中的Left outer join
关键字下显示红色指示器。
查询:
DELETE FROM Duplicate LEFT OUTER JOIN (
SELECT MIN(RowId) as RWID, STUDENT_NAME, STUDENT_ROLLNO, STUDENT_SUBJECT
FROM Duplicate
GROUP BY STUDENT_NAME, STUDENT_ROLLNO, STUDENT_SUBJECT
) as KeepRows ON
Duplicate.RowId = KeepRows.RWID
WHERE KeepRows.RWID IS NULL;
我可以猜测的是,您正在尝试从Duplicate
表中删除重复的记录。从Oracle的角度来看,您的语法似乎不正确。您可以在下面的查询中尝试-
DELETE Duplicate D1
WHERE D1.ROWID NOT IN (SELECT MIN(RowId)
FROM Duplicate
GROUP BY STUDENT_NAME, STUDENT_ROLLNO, STUDENT_SUBJECT)
Oracle不允许JOIN
查询中的DELETE
。如果查看DELETE
中documentation的语法图,这很清楚。
[WHERE
子句中有很多方法可以使用子查询来重写它。最安全的方法可能是Ankit提出的NOT IN
方法,因为即使列为NULL
且rowid
不能为NULL
时,该方法也可以使用。
我会指出,对于大量记录,清空表并重新加载它会更快:
CREATE TABLE nodups as
SELECT d.*
FROM duplicates d
WHERE D.ROWID NOT IN (SELECT MIN(RowId)
FROM Duplicate
GROUP BY STUDENT_NAME, STUDENT_ROLLNO, STUDENT_SUBJECT);
TRUNCATE TABLE duplicates; -- backup first!
INSERT INTO duplicates
SELECT *
FROM nodups;