2013-03-06 4 views
4

Я выполняю запрос, который имеет несколько столбцов в where where, который имеет несколько значений. Я знаю, что в SQL вы можете использовать условие IN для удовлетворения и получения правильного вывода. Каков способ сделать в терадате?несколько столбцов с несколькими значениями в where где

мой код в Oracle выглядит следующим образом:

select td.country_code,td.phone_num 
from telephone_directory td 
where (td.country_code, td.phone_num) in ((91,1234567890),(44,1020304050),(1,998877446655)) 

Это выводит точный результат, т.е. 3 строки

Мой запрос в Teradata выглядит следующим образом

select country_code ,phone_num 
from telephone_directory 
where (country_code in (91, 44, 1) and phone_num in(1234567890, 1020304050, 998877446655) 

Это, однако, возвращает более строки:

country_code phone_num 
91   1234567890 
91   1020304050 
44   1020304050 
1    998877446655 

ПРИМЕЧАНИЕ. Комбинация country_code и номера телефона не уникальна.

Есть ли способ отфильтровать его в терадате, как в ORACLE?

+0

Верхнего запрос использует «парное сравнение подзапрос» (источник: 2007 Oracle SQL слайды класса). Это означает, что два значения должны существовать в одной строке. Второй запрос представляет собой непарельное сравнение, и два значения могут существовать в разных строках как друг друга. Поскольку Teradata не может делать попарные сравнения, лучшим ответом, вероятно, является тот, который показан ниже, чтобы объединить значения в комбинированный ключ. – Bryansix

ответ

1

Логически результаты Teradata, которые вы видите, верны. У вас есть один номер телефона с несколькими кодами стран. Следующий SQL должен давать результат, который вы хотите увидеть:

select td.country_code,td.phone_num 
from telephone_directory td 
where (td.country_code, td.phone_num) 
    in (SELECT 91 AS country_code_ 
      , 1234567890 AS phone_num_ 
     UNION 
     SELECT 44 AS country_code_ 
      , 1020304050 as phone_num_ 
     UNION 
     SELECT 1 as country_code_ 
      , 998877446655 as phone_num_ 
    ); 

Это также может быть переписано с использованием WITH пункта или комбинацией И заявлением, сгруппированным вместе с скобкой для получения правильных результатов.

3

Насколько я знаю, Teradata не поддерживает синтаксис предложения «расширенный» where, который вы можете сделать в Oracle; вам необходимо указать критерии, как составные выражения:

select country_code ,phone_num 
from telephone_directory 
where (country_code=91 and phone_num=1234567890) 
    or (country_code=44 and phone_num=1020304050) 
    or (country_code=1 and phone_num=998877446655) 
+0

Согласовано - Teradata не поддерживает «расширенный» синтаксис предложения WHERE. +1 –

2
select USER_TYPE,USER_ID 
from USER_TABLE 
where (USER_TYPE || USER_ID) in (('F6713'),('S1178'),('M5715'),('F8341'),('F1284')) 
+0

что? Откуда у вас эти ценности? –

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