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

问题描述 投票:0回答:1

我在尝试运行此代码时收到歧义命名的列错误。我不明白为什么?

我用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;

预期结果:无错误实际结果:模棱两可的错误

database oracle
1个回答
1
投票

它是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
                            );
© www.soinside.com 2019 - 2024. All rights reserved.