2013-12-12 3 views
0

У меня возникают проблемы с предложением OR. Я пытаюсь соединить две большие таблицы и приведены ниже выборки данных из таблицПроблемы с предложением OR

Table1 (t1)

 vendor  addr1   city   zip 
     ADT  PO BOX 371956  PITSBURGH  15250 

Table2 (t2)

 vendor addr1  city    zip 
     ADT PO Box 371956 Pittsburgh  15250-7956 

первые два оператора выбора, приведенные ниже, отображают одну строку данных из двух таблиц. В третьем выборе у меня есть предложение OR, и это не отображает строки. Предложение OR не должно влиять на набор результатов.

select * 
from t1 
left join t2 
on t1.addr1 = t2.addr1 


    select * 
    from t1 
    left join t2 
    on t1.addr1 = t2.addr1 
    and (t1.city = t2.city) 

Подборка ниже не содержит данных. ЗАЧЕМ?

select * 
    from t1 
left join t2 
on t1.addr1 = t2.addr1 
and ((t1.city = t2.city) or (t1.zip = t2.zip)) 
+1

Первое, что я замечаю, это то, что ваш или оператор сравнивает молнии и города, в то время как ваши предыдущие утверждения сравнивают города и адреса. Почтовые индексы ваших таблиц не кажутся одинаковыми (в таблице нет дефисной части), и ни один из них не является городами (Pit vs. Pitt в орфографии для одной вещи). Если это фактические данные, это потому, что данные не совпадают. – user2912928

+0

Но это предложение OR, и с момента совпадения в городе не имеет значения, совпадает ли совпадение или нет – stackuser

ответ

2

На вашем последнем запросе у вас есть:

t1.addr1 = t2.addr2 AND 
(
    t1.city = t2.city OR 
    t1.zip = t2.zip 
) 

Принимая во внимание ваши данные выборки:

t1."PO BOX 371956" = t2."PO Box 371956" AND -- TRUE 
(
    t1."PITSBURGH" = t2."Pittsburgh" OR  -- FALSE 
    t1."15250" = t2."15250-7956"   -- FALSE 
) 

Вы получили:

= TRUE AND (FALSE OR FALSE) 
= TRUE AND FALSE 
= FALSE 

Таким образом, нет супа для вас ,

+0

Thankyou! Не думал ясно. – stackuser

+1

Но тогда запрос OP два не должен возвращать строку. – Paparazzi

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