【问题标题】:How to update previous records without updating max record in Netezza如何更新以前的记录而不更新 Netezza 中的最大记录
【发布时间】:2017-05-22 20:46:32
【问题描述】:

希望有人能提供帮助。我正在尝试做一个更新声明。我有一个包含以下列的表:
BUS_NBR_SK, BUS_NBR, EFF_DT, ENT_TMPSTP, EXP_DT

主键是BUS_NBR_SKBUS_NBR。这里只有一张桌子。

这些是插入到表中的,我需要更新旧记录上的 EXP_DT,并使用 max(ENT_TMSTP) 保留最近的记录,我打算只使用 SET b.EXP_DT = current_timestamp 进行更新,其中 @ 987654328@ 但是这不起作用,因为最近的记录也将被分配一个过期日期。

任何想法如何工作?

我尝试了以下方法,但它正在使用最大生效日期更新所有内容。

UPDATE TABLE b
SET b.EXP_DT = (SELECT MAX(a.EFF_DT)
FROM TABLE A
INNER JOIN TABLE B
ON A.BUS_NBR_SK = B.BUS_NBR_SK
AND A.ENT_TMSTP = B.ENT_TMSTP
AND A.BUS_NBR = B.BUS_NBR)
WHERE EXP_DT IS NULL
and ENT_TMSTP != (select max(c.ENT_TMSTP)
from table C)

非常感谢!

example of the fields in the table with sample data.

【问题讨论】:

  • 编辑您的问题并使用您正在使用的数据库对其进行标记。

标签: sql timestamp max netezza


【解决方案1】:

我不确定这是否能解决您的问题,但使用相关子查询至少可以使 set 逻辑正确:

UPDATE table b
    SET b.EXP_DT = (SELECT MAX(a.EFF_DT)
                    FROM TABLE A
                    WHERE A.BUS_NBR_SK = B.BUS_NBR_SK AND
                          A.ENT_TMSTP = B.ENT_TMSTP AND
                          A.BUS_NBR = B.BUS_NBR
                   )
    WHERE b.EXP_DT IS NULL AND
          b.ENT_TMSTP <> (SELECT MAX(c.ENT_TMSTP) FROM table C);

不过,我不确定这是否能解决您的整体问题。

【讨论】:

  • 非常感谢您的及时回复。我似乎遇到了语法错误:^ found "table" (at char 81) expecting WITH' or '(''
  • 我想我只想走这条路并将 exp_date 设置为当前时间戳,如下所示: UPDATE TABLE b SET b.EXP_DT = current_timestamp 并避免更新最新记录。尝试实现此功能时,我不断收到错误。
  • @RoxanneLuick 。 . .对TABLE 的引用在您的原始查询中。它不是 SQL 语法的一部分。表名应该跟在FROM 后面,然后是别名。
  • 我修改了这个并且得到了一个新的错误:FROM 中的 sub-SELECT 必须有一个别名。我以前没有使用过带有子查询的更新。这是我修改后的脚本:UPDATE TABLE b SET b.EXP_DT = CURRENT_TIMESTAMP FROM (SELECT BUS_NBR_SK, BUS_NBR, max (ENT_TMSTP) AS max_ENT_TMSTP FROM TABLE a WHERE A.BUS_NBR_SK = b.BUS_NBR_SK AND A.BUS_NBR = b.BUS_NBR) group by BUS_CARD_ENHANCED_ATTR_SK,BUS_ENTITY_SK 其中 b.EXP_DT 为 NULL 且 ENT_TMSTP max_ENT_TMSTP
  • @RoxanneLuick 。 . .这个答案没有两个级别的子查询。
【解决方案2】:

如果您想用 a.EFF_DT 的日期更新 b.EXP_DT 以获取 BUS_NBR_SK、ENT_TMSTP 和 BUS_NBR 特定键的最新记录,您可以为 A 创建一个 Group by view 或者您可以在更新查询中声明它如下图:

更新表 b SET b.EXP_DT = A_Group.Max_EFF 从表 A 内连接 (选择 BUS_NBR_SK、ENT_TMSTP、BUS_NBR、MAX(A.EFF) 作为 Max_EFF 从 B GROUP BY BUS_NBR_SK、ENT_TMSTP、BUS_NBR)作为 A_Group ON A_Group.BUS_NBR_SK = b.BUS_NBR_SK 和 A_Group.ENT_TMSTP = b.ENT_TMSTP AND A_Group.BUS_NBR = b.BUS_NBR 其中 b.EXP_DT 为空且 b.ENT_TMSTP (A_Group.Max_EFF);

希望对您有所帮助。 塞尔吉奥

【讨论】:

  • 我修改了这个并且得到了一个新的错误:FROM 中的 sub-SELECT 必须有一个别名。我以前很少使用子查询的更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
  • 2022-01-06
  • 1970-01-01
  • 2020-07-19
  • 2021-12-21
  • 1970-01-01
  • 2019-03-02
相关资源
最近更新 更多