[在SQL中进行左外部Join时的SQL语法错误

问题描述 投票:0回答:2

我正在使用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; 
sql oracle sql-delete
2个回答
2
投票

我可以猜测的是,您正在尝试从Duplicate表中删除重复的记录。从Oracle的角度来看,您的语法似乎不正确。您可以在下面的查询中尝试-

DELETE Duplicate D1
 WHERE D1.ROWID NOT IN (SELECT MIN(RowId)
                          FROM Duplicate
                         GROUP BY STUDENT_NAME, STUDENT_ROLLNO, STUDENT_SUBJECT)


0
投票

Oracle不允许JOIN查询中的DELETE。如果查看DELETEdocumentation的语法图,这很清楚。

[WHERE子句中有很多方法可以使用子查询来重写它。最安全的方法可能是Ankit提出的NOT IN方法,因为即使列为NULLrowid不能为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;
© www.soinside.com 2019 - 2024. All rights reserved.