根据连接表的日期列之一的最大日期值执行更新 (Oracle)
Posted
技术标签:
【中文标题】根据连接表的日期列之一的最大日期值执行更新 (Oracle)【英文标题】:Perform Update Based On Max Date Value Of One of the Join Table's Date Column (Oracle) 【发布时间】:2017-11-29 12:38:20 【问题描述】:我试图根据它与其他表的复杂关系来更新 Table_H 的“描述”列。这是原始的(有些模糊的)查询:
UPDATE Table_H hb SET
description = 'New Description'
where exists
(select 1
from TABLE_J j, TABLE_I i, TABLE_K k, Table_H h, TABLE_M m
where j.Alt_id = i.Alt_id
and i.id=k.id
and k.id=h.id
and k.Alt_id = m.Alt_id
and j.Activity='Activity A'
and h.description = 'Old Description'
and h.id=hb.id
);
这个查询的问题是它更新了太多的 Table_H 行(因为这些行与查询中其他表的行相关)。这是因为 Table_H 具有多个相同的行,但 Table_H.date 字段除外,该字段始终是唯一的。我真正需要做的是仅使用 MAX Table_H.date 字段更新 Table_H 行。
我无法找到与我的情况特别接近的旧线程。显然我必须介绍 Table_H.Date 列,但不知道如何进行。我将不胜感激。谢谢
【问题讨论】:
所以你只想更新日期最长的那一行? 是的,这是正确的 【参考方案1】:我希望你需要这样的东西。
UPDATE Table_H hb
SET description = 'New Description'
WHERE EXISTS
(SELECT 1
FROM TABLE_J j,
TABLE_I i,
TABLE_K k,
Table_H h,
TABLE_M m
WHERE j.Alt_id = i.Alt_id
AND i.id =k.id
AND k.id =h.id
AND k.Alt_id = m.Alt_id
AND j.Activity ='Activity A'
AND h.description = 'Old Description'
AND h.id =hb.id
)
AND hb.date_t IN
( SELECT MAX(Date_t) FROM Table_H
);
这里Date_t
是您的date
专栏
【讨论】:
谢谢。我尝试将“AND hb.date ...”添加到末尾。虽然它运行,但由于某种原因它没有更新任何列。 您没有任何记录满足这两个条件。【参考方案2】:感谢您的回复。我找到了一种不直接使用日期列的方法。我改用了 max(table_h.id) 列(我意识到 max id 直接对应于 max(table_h.date) ,这使得查询更早编写)。这是解决方案。如果这对 *** 中的其他人来说不是一个很好的学习机会,我深表歉意:
UPDATE Table_H hb
SET description = 'New Description'
WHERE EXISTS
(SELECT 1 from
(select max(h.id) hid, k.Alt_id
FROM TABLE_J j,
TABLE_I i,
TABLE_K k,
Table_H h,
TABLE_M m
WHERE j.Alt_id = i.Alt_id
AND i.id =k.id
AND k.id =h.id
AND k.Alt_id = m.Alt_id
AND j.Activity ='Activity A'
AND h.description = 'Old Description'
GROUP BY k.alt_id) abc
WHERE abc.hid = hb.id
)
【讨论】:
以上是关于根据连接表的日期列之一的最大日期值执行更新 (Oracle)的主要内容,如果未能解决你的问题,请参考以下文章
如何根据R中另一列的日期(月/日/年)计算列的年/月平均值、最大值、最小值等
pandas使用max函数和min函数计算dataframe日期(时间)数据列中最大日期和最小日期(maximum and minimum date or time in dataframe)
pandas使用max函数和min函数计算dataframe日期(时间)数据列中最大日期和最小日期对应的数据行(maximum and minimum date or time row)