嵌套查询-选择表的第一项并将其与其他表的内容进行比较

时间:2018-07-03 08:51:26

标签: sql nested teradata

我正在与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 :(得分:1)

我看不到为什么需要一个子查询来进行联接,我有一个直接联接和一个子查询来查找“第一”行。我不确定是什么定义了“第一”行,因此在这里我使用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,而不是查找“第一”行。

答案 1 :(得分:0)

答案取决于您通过第一个值定义的内容。 ;)-但我们尝试:

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,从而导致表高度偏斜。因此,我建议始终添加主键定义,即使说“ NO PRIMARY INDEX” ...

PS:由于预期的执行计划,我认为需要SubQuery。首先联接两个大表并进行过滤没有意义。如果您将一个表(带有一个(预先过滤的)较小的子表)连接到一个表中,对于Spool和RDBMS来说更方便。