Вывод запроса DB2 - другое поведение - PullRequest
0 голосов
/ 31 октября 2008

У меня есть две таблицы TAB_A и TAB_B. TAB_A - это главная таблица, а TAB_B - это дочерняя таблица / таблица транзакций. TAB_A имеет COL_A (первичный ключ), а TAB_B имеет COL_B (первичный ключ), а также COL_A.

По некоторым бизнес-причинам внешний ключ не определен между TAB_A и TAB_B в столбце COL_A.

В TAB_B есть четыре записи с некоторыми значениями, скажем, 1, 2, 3 и 4 в COL_A, которые не имеют соответствующих совпадающих значений в COL_A TAB_A. (Это записи-сироты, созданные по ошибке)

Когда я запускаю следующий запрос SELECT, я получаю четыре записи

SELECT B.COL_B,
       B.COL_A
  FROM TAB_A A,
       TAB_B B
 WHERE A.COL_A = B.COL_A
   AND B.COL_A IN (1, 2, 3, 4)

Но если я начну ссылаться на A.COL_A в запросе SELECT, записи не будут возвращены.

SELECT B.COL_B,
       B.COL_A,
       A.COL_A
  FROM TAB_A A,
       TAB_B B
 WHERE A.COL_A = B.COL_A
   AND B.COL_A IN (1, 2, 3, 4)

Может кто-нибудь объяснить это странное поведение?

DB2 Версии 9.5 в AIX

Ответы [ 4 ]

1 голос
/ 03 ноября 2008

Оба запроса должны возвращать одинаковые строки. Если это действительно так, как вы описали, вы обнаружили ошибку в DB2.

Что вы пытаетесь выполнить с помощью этого запроса? Если значения (1,2,3,4) B.COL_A являются потерянными записями, то этот запрос не должен возвращать никаких строк. Если вы хотели искать сирот, вам, вероятно, нужно выполнить какое-то внешнее объединение.

0 голосов
/ 03 марта 2014

Ваш второй SQL по сути является "INNER JOIN".

Поскольку строки таблицы B 1,2,3,4 являются сиротами, условие A.COL_A = B.COL_A никогда не будет истинным.

Вам нужно было бы написать явное «LEFT OUTER JOIN», чтобы вернуть строки, но A.COL_A всегда будет возвращать NULL.

0 голосов
/ 31 октября 2008

Я посмотрел документацию на сайте IBM. Хотя они говорят об использовании «JOIN», есть также упоминание об использовании прямого объединения с использованием условий «WHERE» (которые я использовал) и упоминалось, что они должны давать тот же результат.

Кроме того, я ранее работал в Oracle и SQL Server. Вышеуказанный синтаксис просто работал нормально. Все еще не уверен, почему выходные данные отличаются, просто потому, что в предложении SELECT добавлен дополнительный столбец

0 голосов
/ 31 октября 2008

Вы должны использовать предложение ON вместо предложения WHERE во внутреннем соединении. Предложение ON относится к фактическому соединению, тогда как WHERE обычно используется для дополнительных условий, не связанных с соединением.

IBM говорит : «Условие соединения указывается после ключевого слова ON и определяет, как две таблицы должны сравниваться друг с другом для получения результата объединения. [...] Любые дополнительные условия, которые не относятся к фактическому соединению, указываются либо в WHERE. или как часть фактического объединения в предложении ON. "

Похоже, вы делаете обратное в своих примерах, имея условие соединения в предложении WHERE. AFAIK, это не является недопустимым, но может объяснить это странное поведение, когда используется с предложением SELECT, которое ссылается только на столбцы из одной из таблиц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...