我正在与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*/
;
这有可能吗?
答案 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来说更方便。