ORA-00933:SQL命令未以INSERT INTO…SELECT语句正确结束
我偶然解决了我的问题,但我真的想知道它为什么会起作用: 事情是这样的: 执行以下SQL语句时,我收到ORA-00933:SQL命令未正确结束错误: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
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,它就可以工作了^_^