列命名不明确错误,尽管解决了列来自哪个表的问题



尝试运行此代码时,我收到"名称不明确"列错误。我不明白为什么?

我用谷歌搜索并发现使用同名列时可能会发生此错误,但我已经指定了我认为每列来自哪些表来修复它。

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
);

最新更新