2014-10-30 3 views
0

Я попытался запустить ниже запрос в Teradata и это привело, как ожидалось:Как работает запрос в Teradata?

select column1 as c1Alias from my_table where column2 in (c1Alias , 10 , 20 , 30) ; 

Но я попытался запустить тот же запрос на энцефалопатии, он бросает исключение, как указано ниже:

FAILED: SemanticException [Error 10004]: Line 1:44 Invalid table alias or column reference 'c1Alias': (possible column names are: .......) 

Я не удивился, почему он терпит неудачу в HIVE, но удивил, как он работает над Teradata.

Согласно моему пониманию, Классы выполняются в порядке, КАК ГДЕ >> ВЫБРАТЬ. Очевидно, псевдоним, сгенерированный в предложении SELECT, не будет доступен для использования в предложении WHERE. Поправьте меня, если я ошибаюсь.

Я действительно хотел знать, как он работает в терадате?

+0

Teradata позволяет использовать псевдоним в предложении where, а также группировать и упорядочивать по предложениям. – Andrew

ответ

1

Вы правильно, логически любой ВЫБРАТЬ обрабатывается в следующем порядке:

  • ОТ
  • ГДЕ
  • GROUP BY
  • HAVING
  • функции OLAP
  • QUALIFY
  • создать список столбцов SELECT
  • ОБРАЗЦА
  • ORDER BY

Кроме того, фирменная QUALIFY/ОБРАЗЕЦ каждый СУБД будет делать это точно так же.

Когда вы добавляете фильтр в условие WHERE, список столбцов еще не создан, поэтому использование псевдонима должно завершиться неудачно (и не будет работать почти во всех других СУБД, только afaik Access позволяет использовать его аналогично Teradata).

Это не терпит неудачу, потому что Teradata старше стандартного SQL, и это, похоже, реликт языка запросов, реализованного Teradata.

Но это прекрасное расширение (просто никогда не псевдоним существующего имени столбца, чтобы избежать путаницы с оптимизатором и/или конечным пользователем), и вы привыкаете к нему очень быстро, он позволяет избежать обрезки пасты или производных таблиц.

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