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_DATEa.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 - 用另一张表中的最大数据更新一张表的主要内容,如果未能解决你的问题,请参考以下文章

VBA循环使用另一张表中的数据更新图表中的系列

根据另一张表中的值更新一张表

把一张表中某列数据更新到另一张表的某列

把一张表中某列数据更新到另一张表的某列

Clickhouse 将一张表中的数据聚合到另一张表中

SQL 显示一张表中的数据并计算另一张表中的结果