尝试运行此代码时,我收到"名称不明确"列错误。我不明白为什么?
我用谷歌搜索并发现使用同名列时可能会发生此错误,但我已经指定了我认为每列来自哪些表来修复它。
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兼容代码重写为其"旧"语法(例如外部连接;它仍然使用旧的(+)
运算符(,但尽管如此,尝试的成本并不高。
[编辑:为什么你的行太多了?
由于我没有你的表格,我将使用斯科特的EMP和部门。您的查询如下所示:
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
列在EMP
表的deptno
列中不存在。查看结果,您可以看到我们有会计部门 (10(,它与部门不是 10 而是 (20, 30( 的EMP
表中的值"配对"。
两个表中的所有其他行也是如此,因此 - 基本上 - 你得到
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
);