嵌套查询 - 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 会更方便
我正在使用 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 会更方便