我在尝试运行此代码时收到歧义命名的列错误。我不明白为什么?
我用Google搜索,发现当使用具有相同名称的列时可能会发生此错误,但是我指定了每个列来自哪些表,我认为这些表应该用来修复它。
INSERT INTO A2ERROREVENT (ERRORID, SOURCE_ROWID, SOURCE_TABLE, ERRORCODE, FILTERID, DATETIME, ACTION)
SELECT 1, ROWID, 'A2CUSTBRIS', 167, 4, CURRENT_DATE, 'MODIFY'
FROM a2custbris cb, a2custcategory cc
WHERE cb.custcatcode NOT IN cc.custcatcode;
预期结果:无错误实际结果:模棱两可的错误
它是ROWID
。它属于哪个表?是a2custbris
还是a2custcategory
?
如果指定rowid
的来源,它将起作用:
SELECT 1,
cb.ROWID, --> this
'A2CUSTBRIS' ...
尽管,您需要它做什么? ROWID可以更改,因此您可能(并且将)丢失信息,其中该行包含源信息。也许您宁愿存储主键,而不是ROWID
。
而且,尽管它不能解决这个问题,但是在连接表时,请尝试切换到当前的ANSI标准。单独保持连接,将条件移到WHERE
子句。它使代码更容易理解,因此您的代码可能看起来像
FROM a2custbris cb JOIN a2custcategory cc
ON cb.custcatcode NOT IN cc.custcatcode
尽管,Oracle仍在内部将“新的”符合ANSI的代码重写为“旧的”语法(例如外部联接;它仍使用旧的(+)
运算符),但是,try]并不会花费太多。 。
[编辑:为什么行太多?]
由于我没有您的桌子,我将使用Scott的EMP和DEPT。您的查询如下所示:
SQL> select e.rowid, d.deptno, d.dname, e.ename, e.deptno 2 from dept d join emp e on d.deptno not in e.deptno 3 order by d.deptno, e.ename, e.deptno; ROWID DEPTNO DNAME ENAME DEPTNO ------------------ ---------- -------------- ---------- ---------- AAAE5mAAEAAAAGeAAK 10 ACCOUNTING ADAMS 20 AAAE5mAAEAAAAGeAAB 10 ACCOUNTING ALLEN 30 AAAE5mAAEAAAAGeAAF 10 ACCOUNTING BLAKE 30 AAAE5mAAEAAAAGeAAM 10 ACCOUNTING FORD 20 AAAE5mAAEAAAAGeAAL 10 ACCOUNTING JAMES 30 AAAE5mAAEAAAAGeAAD 10 ACCOUNTING JONES 20 AAAE5mAAEAAAAGeAAE 10 ACCOUNTING MARTIN 30 AAAE5mAAEAAAAGeAAH 10 ACCOUNTING SCOTT 20 AAAE5mAAEAAAAGeAAA 10 ACCOUNTING SMITH 20 AAAE5mAAEAAAAGeAAJ 10 ACCOUNTING TURNER 30 AAAE5mAAEAAAAGeAAC 10 ACCOUNTING WARD 30 <snip, as the result returns 42 rows>
如何阅读?查询说:给我
DEPT
表中的行,这些行的deptno
列在deptno
表的EMP
列中不存在。查看结果,您可以看到我们有一个会计部门(10),它与EMP
表中的值不是10而是(20,30)的值“配对”。
两个表中的所有其他行都一样,所以-基本上-您会得到
EMP number of rows (14) * (DEPT number of rows - 1) (4 - 1 = 3) = 14 * 3 = 42
现在,这取决于您真正想要做什么,哪些行是您感兴趣的行。也许是
NOT IN
使用子查询:
SQL> select d.rowid, d.deptno, d.dname 2 from dept d 3 where d.deptno not in (select e.deptno from emp e); ROWID DEPTNO DNAME ------------------ ---------- -------------- AAAE5nAAEAAAAGmAAD 40 OPERATIONS SQL>
这表示:没有员工在部门40工作,因此只返回一行。
已复制到您的案例,看看是否有帮助:
SELECT 1, cb.ROWID, 'A2CUSTBRIS', 167, 4, CURRENT_DATE, 'MODIFY'
FROM a2custbris cb
WHERE cb.custcatcode NOT IN (SELECT cc.custcatcode
FROM a2custcategory cc
);