Это 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
);