2008-10-31 6 views
0

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

По какой-либо причине, внешний ключ не определяется между 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

+0

Пожалуйста, убедитесь, что первый запрос точно так, как описано, и что он фактически возвращает 4 записи.Он ничего не должен возвращать, если в TAB_B не существует значений 1,2,3,4 для COL_A. – 2008-10-31 08:40:01

+0

Очевидно, что во втором запросе есть опечатка, возможно, вы говорите A.COL_A = B.COL_C или некоторые другие опечатки – Hogan 2013-11-18 16:01:59

ответ

0

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

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

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

0

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

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

+0

У вас есть опечатка, и это не подходящее место для вас, чтобы добавить к вашему вопросу, этот контент должен быть частью вопроса. – Hogan 2013-11-18 16:01:13

1

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

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

0

Ваш второй SQL фактически является «INNER JOIN».

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

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

Смежные вопросы