【问题标题】:Sql syntax error while doing left outer Join in SQL在 SQL 中进行左外连接时出现 Sql 语法错误
【发布时间】:2020-05-05 16:14:15
【问题描述】:

我正在使用 oracle 数据库并尝试从中删除重复记录。 同样,我写了一个下面的查询,但得到了这个错误

SQL Error: ORA-00933: SQL command not properly ended
00933. 00000 -  "SQL command not properly ended"

它在Left outer join查询中的outer关键字下给出红色指示符。

查询:

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; 

【问题讨论】:

  • MySQL SQL Server Oracle;请只标记您真正使用的RDBMS。此外,仅发布代码不会产生问题。将我们需要的信息放入您的问题中;以及您为尝试解决问题所做的工作。

标签: sql oracle sql-delete


【解决方案1】:

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

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

【讨论】:

  • 是的,这是可能的问题解决方案之一,但我的查询有什么问题..?
  • 任何建议..?
  • 只需运行我发布的查询。这是 Oracle 支持的正确语法。
【解决方案2】:

Oracle 不允许在 DELETE 查询中使用 JOINs。如果您查看documentationDELETE 的语法图,这一点就很清楚了。

有很多方法可以使用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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-18
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    相关资源
    最近更新 更多