2 запроса, которые должны возвращать те же данные, но не - PullRequest
1 голос
/ 22 апреля 2011

У меня есть 2 запроса Informix, которые, по моему мнению, должны возвращать те же данные, но не возвращают. Первый запрос использует подзапрос в качестве фильтра и неправильно возвращает никаких строк. Вторая выполняется с использованием проверки левого внешнего соединения на нулевое значение в том же столбце, который использовался в подзапросе, и она правильно возвращает правильный набор данных. Я что-то упустил или это ошибка?

select i.invoice_date, oe.commit_no
  from oe
  join invoice i
  on oe.invoice_no = i.invoice_no
  where i.invoice_date > today - 60
  and oe.commit_no not in (select commit_no from bolx)

select i.invoice_date, oe.commit_no, bolx.bol_no
  from oe
  join invoice i
  on oe.invoice_no = i.invoice_no
  left join bolx
  on bolx.commit_no = oe.commit_no
  where i.invoice_date > today - 60
  and bolx.commit_no is null

Сокращенные схемы (это устаревшая БД, поэтому у нее есть некоторые причуды):

invoice
    invoice_no char(9),
    invoice_date date

oe
    commit_no decimal(8, 0),
    invoice_no char(9)

bolx
    commit_no decimal(8, 0)

1 Ответ

3 голосов
/ 22 апреля 2011

Каждый раз, когда я читаю "Не в ... подзапрос ... не возвращает строк", я почти уверен, что знаю ответ!

Полагаю, select commit_no from bolx возвращает некоторые NULL значения?

Наличие NULL в NOT IN гарантирует, что результаты не будут возвращены.

foo NOT IN (bar, NULL) эквивалентно

foo <> bar and foo <> NULL

Партия foo <> NULL всегда оценивается в unknown, а AND никогда не может оцениваться в true, если все условия не оцениваются в true.

...