Netezza - 用另一张表中的最大数据更新一张表
Posted
技术标签:
【中文标题】Netezza - 用另一张表中的最大数据更新一张表【英文标题】:Netezza - update one table with max data from another table 【发布时间】:2021-07-26 14:24:11 【问题描述】:我在 netezza 中有一个需要更新的表。我正在使用的列是
表 A
ID_NO ENTRY_DATE 价格表 B
ID_NO START_DATE END_DATE 价格因此数据示例如下所示:
表 A
ID_NO | ENTRY_DATE | PRICE |
---|---|---|
123 | 2020-05-01 | |
123 | 2020-08-15 |
表 B
ID_NO | START_DATE | END_DATE | PRICE |
---|---|---|---|
123 | 2019-01-01 | 2019-11-01 | $7.64 |
123 | 2020-04-30 | 2020-05-02 | $6.19 |
123 | 2020-04-15 | 2020-08-30 | $2.19 |
我需要将表 A 中的价格更新为表 B 中的最大价格,其中 a.ENTRY_DATE 介于 b.START_DATE 和 b.END_DATE 之间。所以决赛桌应该是这样的:
表 A
ID_NO | ENTRY_DATE | PRICE |
---|---|---|
123 | 2020-05-01 | $6.19 |
123 | 2020-08-15 | $2.19 |
这是我到目前为止所拥有的,但它最终只是采用适合任一行的最高价格,而不是对每一行进行计算:
update TABLE_A
set PRICE=(select max(b.PRICE)
from TABLE_B b
inner join TABLE_A a on a.ID_NO=b.ID_NO
where a.ENTRY_DATE between b.START_DATE and b.END_DATE)
【问题讨论】:
您的示例查询在WHERE
子句中有令人困惑的错误。例如; b.ENTRY_DATE
或 a.START_DATE
都不存在。
哎呀,对不起。修复了该子句上的表引用。
【参考方案1】:
我无权访问 Netezza,但通常的格式是使用相关子查询。
也就是说,不是在查询中再次包含TABLE_A
,而是引用TABLE_A
的外部引用...
update
TABLE_A
set
PRICE = (
select max(b.PRICE)
from TABLE_B b
where TABLE_A.ID_NO = b.ID_NO
and TABLE_A.ENTRY_DATE between b.START_DATE and b.END_DATE
)
通过这种方式,关联子查询实质上为TABLE_A
中的每一行调用一次,并且该调用使用TABLE_A
中的当前行作为其参数。
另一种可能是......
update
TABLE_A
set
PRICE = revised.PRICE
from
(
select a.ID_NO, a.ENTRY_DATE, max(b.PRICE) AS PRICE
from TABLE_B b
inner join TABLE_A a on a.ID_NO=b.ID_NO
where a.ENTRY_DATE between b.START_DATE and b.END_DATE
group by a.ID_NO, a.ENTRY_DATE
)
AS revised
where
TABLE_A.ID_NO = revised.ID_NO
and TABLE_A.ENTRY_DATE = revised.ENTRY_DATE
【讨论】:
感谢您的回答!不幸的是,不支持相关的子查询,这是我在这篇文章中遇到这么多麻烦的部分原因。 @eric Alternative 添加到答案中。 我认为这可能行得通!我需要对更大的数据集进行一些测试,但看起来很有希望。 它看起来成功了。非常感谢!以上是关于Netezza - 用另一张表中的最大数据更新一张表的主要内容,如果未能解决你的问题,请参考以下文章