Нарушение целостности в базе данных Oracle - PullRequest
0 голосов
/ 17 сентября 2018

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

SQL> desc errors;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 err_letid                                         NUMBER(20)
 *some other details*


SQL> desc my_letters;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 LET_ID                                    NOT NULL NUMBER(10)
 LET_ISSUEDTO                              NOT NULL NUMBER(10)

Письмо выдается людям за определенные ошибки.Не все ошибки связаны с буквами.

В приведенной выше таблице err_letid является внешним ключом для let_id в my_letters таблице '.

Теперь проблема в

SQL> select * from my_letters where let_id = 818
  2  /

    LET_ID LET_ISSUEDTO 
---------- ------------ 
       818      8877554

SQL> select * from errors where err_letid =818
  2  /

no rows selected

SQL> select * from my_letters where let_id not in (select err_letid from errors);

no rows selected

Как это может произойти?

1 Ответ

0 голосов
/ 17 сентября 2018

Не используйте not in с подзапросами. Запрос не возвращает строк, если значение any в подзапросе равно NULL.

Вместо этого используйте not exists:

select l.*
from my_letters l
where not exists (select 1 from errors e where l.let_id = e.err_letid);

Он ведет себя так, как вы ожидаете.

...