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

Nested Queries - select first item of table and compare it with content of other table

我正在使用 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*/
;

这有可能吗?

我不明白为什么您的连接需要子查询,我有一个直接连接和一个子查询来查找 "first" 行。我不确定是什么定义了 "first" 行,所以在这里我使用了 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 而不是查找 "first" 行。

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

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,因此会得到一个高度倾斜的 table。所以我建议始终添加主键定义,即使在说 "NO PRIMARY INDEX"...

时也是如此

PS:由于预期的执行计划,我看到需要 SubQuery。先加入两个大的table然后再过滤是没有意义的。如果将 table 与(预过滤的)较小的子 table.

连接起来,对于 Spool 和 RDBMS 会更方便