Ошибка с неоднозначным именем столбца, несмотря на обращение к таблице, из которой получены столбцы - PullRequest
0 голосов
/ 20 октября 2019

Я получаю ошибку столбца с неоднозначным именем при попытке запустить этот код. Я не понимаю, почему?

Я гуглил и обнаружил, что эта ошибка может возникать при использовании столбцов с одинаковыми именами, но я указал, из каких таблиц приходит каждый столбец, и который, как я считаю, предназначен для его исправления.

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;

Ожидаемые результаты: без ошибок Фактический результат: неоднозначная ошибка

1 Ответ

2 голосов
/ 20 октября 2019

Это ROWID. К какому столу это относится? Это a2custbris или a2custcategory?

Если вы укажете источник rowid, он будет работать:

SELECT 1, 
       cb.ROWID,          --> this
       'A2CUSTBRIS' ...

Хотя, для чего он вам нужен? ROWID может измениться, поэтому вы можете (и будете) терять информацию, в какой строке хранится информация об источнике. Возможно, вы предпочитаете хранить первичные ключи, а не ROWID (s).


Кроме того, хотя это не решит эту проблему, попробуйте перейти на текущий стандарт ANSI при присоединениистолы. Храните объединения отдельно, перенесите условия в пункт WHERE. Это делает код несколько легче для понимания, поэтому ваш может выглядеть как

FROM a2custbris cb JOIN a2custcategory cc
  ON cb.custcatcode NOT IN cc.custcatcode

Хотя Oracle все еще внутренне переписывает «новый» ANSI-совместимый код в свой «старый» синтаксис (такой как внешнее соединение; он все еще используетстарый оператор (+)), но, тем не менее, стоит попробовать .


[РЕДАКТИРОВАТЬ: почему вы получили слишком много строк?]

Поскольку у меня нет ваших столов, я буду использовать 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
                            );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...