ORA-00933:SQL命令未以INSERT INTO…SELECT语句正确结束

ORA-00933:SQL命令未以INSERT INTO…SELECT语句正确结束,sql,oracle,oracle11gr2,Sql,Oracle,Oracle11gr2,我偶然解决了我的问题,但我真的想知道它为什么会起作用: 事情是这样的: 执行以下SQL语句时,我收到ORA-00933:SQL命令未正确结束错误: INSERT INTO BASP_DX.QLR@GT(BDCDYH, QSZT) SELECT NVL(e.BDCDYH, ' '),b.LIFECYCLE AS QSZT FROM DJ_DY a LEFT JOIN DJ_XGDJGL d ON d.ZSLBH = a.SLBH LEFT JOIN DJ_D

我偶然解决了我的问题,但我真的想知道它为什么会起作用:

事情是这样的:

执行以下SQL语句时,我收到ORA-00933:SQL命令未正确结束错误:

  INSERT INTO BASP_DX.QLR@GT(BDCDYH, QSZT)
  SELECT NVL(e.BDCDYH, ' '),b.LIFECYCLE AS QSZT
  FROM DJ_DY a
    LEFT JOIN DJ_XGDJGL d
      ON d.ZSLBH = a.SLBH
    LEFT JOIN DJ_DJB e
      ON e.SLBH = d.FSLBH
        AND e.SLBH = '0123456789'
    LEFT JOIN DJ_QLRGL f
      ON f.SLBH = e.SLBH
        AND f.QLRLX = 'Person1'
    LEFT JOIN DJ_QLRGL b
      ON b.SLBH = a.SLBH
        AND (b.QLRLX = 'Person2' OR (b.QLRLX = 'Person3' AND b.QLRID = f.QLRID))
  WHERE a.SLBH = '12345'
    AND e.SLBH IS NOT NULL
    -- add the condition to ensure that 
    -- this statement and the second statement get the same result 
    AND b.QLRID IS NOT NULL
    AND (a.LIFECYCLE = '0' OR a.LIFECYCLE IS NULL);
我从原始SQL语句中删除了所有不必要的插入值、相关表和条件,以关注问题部分

然后我用谷歌搜索,从中我知道原因可能是:

带有ORDERBY子句或内部联接的INSERT语句 带有内部联接或ORDER BY子句的DELETE语句 具有内部联接的UPDATE语句 显然,这不是我喜欢的类型。我没有使用内部JOIN和ORDER BY,我只使用了LEFT JOIN语句,所以我想知道这可能是因为我用LEFT JOIN语句设置了太多的条件,例如LEFT JOIN DJ_QLRGL b,所以我尝试将条件移到WHERE子句之后,看起来像这样:

  INSERT INTO BASP_DX.QLR@GT(BDCDYH, QSZT)
  SELECT NVL(e.BDCDYH, ' '),b.LIFECYCLE AS QSZT
  FROM DJ_DY a
    LEFT JOIN DJ_XGDJGL d
      ON d.ZSLBH = a.SLBH
    LEFT JOIN DJ_DJB e
      ON e.SLBH = d.FSLBH
        AND e.SLBH = '0123456789'
    LEFT JOIN DJ_QLRGL f
      ON f.SLBH = e.SLBH
        AND f.QLRLX = 'Person1'
    LEFT JOIN DJ_QLRGL b
      ON b.SLBH = a.SLBH
    -- this conditions move to WHERE clause
  WHERE a.SLBH = '12345'
    AND e.SLBH IS NOT NULL
    -- here is the original LEFT JOIN condition
    AND (b.QLRLX = 'Person2' OR (b.QLRLX = 'Person3' AND b.QLRID = f.QLRID))
    AND (a.LIFECYCLE = '0' OR a.LIFECYCLE IS NULL);
那就行了! 但是为什么呢

我只是想知道这种情况的原因

解决方案


问题是三角连接,左连接条件不能包含关于两个自连接表的条件,在这种情况下,它是b.QLRID=f.QLRID,所以当我删除b.QLRID=f.QLRID条件时,它就工作了。

首先,DJ_QLRGL b的连接不再保留,
由于WHERE条件排除了未找到b对应项的行

谢谢您的回复,我不明白,您的意思是我加入DJ_QLRGL两次是我得到ORA-00933错误的原因吗???您提供的两个SQL不相等。查询2中将不存在未找到b.SLBH=a.SLBH的行是的,您是对的!我应该在第一条SQL语句中的where子句之后添加AND b.QLRID not null~~~但是我仍然想知道第二条SQL语句工作的原因,任何线索??三角连接可能是原因。您是否尝试用Oracle连接语法表达相同的内容,例如,在FROM子句中列出所有表,在WHERE中列出所有连接条件?我听从您的建议,使用Oracle连接语法,效果很好,然后我用谷歌搜索三角形连接,因为我不知道它是什么:,我得到了三角形连接的两个因素:1。表连接回自身;2.连接基于来自的不等式。在第二条语句中,DJ_QLRGL仍然连接回自身,但它可以工作,因此问题不是第一条。情况可能有什么问题吗?关于两个DJ_QLRGL的条件可能有问题吗?删除条件b.QLRID=f.QLRID,它就可以工作了^_^