Вложенные запросы - выберите первый элемент таблицы и сравните его с содержимым другой таблицы. - PullRequest
0 голосов
/ 03 июля 2018

Я работаю с Teradata и пытаюсь использовать вложенные запросы.

Мой запрос выглядит примерно так:

create table test as
    select id, selected_value, *
    from database.table as data
    left join (select id, value, value_search 
               from database2.table2 
               where value = 1) as data2 on data.id = data2.id 
    where selected_value >= first_value_search_of_data2   /*i want to select everything that is greater or equal to the first item of data2 in column value_search*/
;

Возможно ли это как-нибудь?

Ответы [ 2 ]

0 голосов
/ 09 июля 2018

ответ зависит от того, что вы определяете по первому значению. ;) - Но давайте попробуем:

SELECT ID, SELECTED_VALUE
  FROM DATABASE.TABLE AS DATA2
       LEFT JOIN (
         SELECT ID, VALUE, VALUE_SEARCH
           FROM DATABASE2.TABLE2
          WHERE VALUE = 1
          QUALIFY ROW_NUMBER() OVER (PARTITION by ID, VALUE ORDER BY VALUE_SEARCH DESC) = 1
       ) AS DATA2
       ON DATA.ID = DATA2.ID
 WHERE SELECTED_VALUE >= VALUE_SEARCH;

Вы можете определить свое определение первого значения в определении ROW_NUMBER.

И последнее: если вы не определили PrimaryIndex (DistrubutionKey), Teradata всегда занимает первую строку. Это может привести к нежелательному PI и, следовательно, к сильно перекосившейся таблице. Поэтому я рекомендую всегда добавлять определение первичного ключа, даже когда говорится «НЕТ ПЕРВИЧНОГО ИНДЕКСА» ...

PS: я вижу необходимость в SubQuery из-за ожидаемого плана выполнения. Сначала нет смысла объединять две большие таблицы и фильтровать их. Для Spool и RDBMS удобнее, если вы объединяете таблицу с (предварительно отфильтрованной) меньшей вложенной таблицей.

0 голосов
/ 03 июля 2018

Я не понимаю, зачем вам нужен подзапрос для вашего соединения, у меня есть прямое соединение и подзапрос, чтобы найти «первую» строку. Я совершенно не уверен, что определяет «первую» строку, поэтому здесь я использовал MAX(), так как у вас было >= в вашем примере кода

select id, selected_value, *
from database.table as data 
left join database2.table2 as data2 on data.id = data2.id and data2.value = 1
where selected_value >= (SELECT MAX(value_search) FROM database2.table2)

В качестве альтернативы последний подзапрос может основываться на ORDER BY вместо поиска «первой» строки.

...