2015-12-24 40 views
2

我需要从表A中获取本地名称,这些名称在过去30天内使用SQL进行了更改。 我是否需要创建表的备份或者是否有其他方法? 如果创建备份是唯一的方法,我们如何比较并找出本地覆盖的名称?如何获取数据库中已更改的数据?

表详细信息:

TREE_ID   (NUMBER) 
TREE_NM   (VARCHAR2) 
TREE_LEVEL  (VARCHAR2) 
UPLEVEL_ID  (NUMBER) 
HRCHY_TYPE  (VARCHAR2) 
CATG_ID   (NUMBER) 
SUBCATG_ID  (NUMBER) 
STATUS   (VARCHAR2) 
USER_ID   (NUMBER) 
CREATE_DATE  (DATE) 
EFFCT_START_DATE (DATE) 
EFFCT_END_DATE (DATE) 
UPDATED_DATE  (DATE) 
TOP_LEVEL_ID  (NUMBER) 

我需要生成在每月的最后一个进料来获取改变TREE_NM

+3

请给我们一个表格说明,请问Oracle的哪个版本? – kevinsky

+0

你需要更具体的 – drinovc

+0

服务器是sql还是oracle? – Marshal

回答

2

我认为Oracle没有默认的操作来实现这一点。一种可能的解决方法可能是将一个新列添加到您的表A中,并在其中存储modificationDate。然后定义一个Before Insert OR Update Trigger,它将新值(当前日期)写入已插入或更新的所有行。

希望这会有所帮助。

+0

我的投票将你的声望变为三位数。你欠我一杯啤酒。 –

+0

Ohk谢谢。 但是我不应该对现在的表格做任何改变。 有没有其他方法可以建议? – Aishwarya

+0

好的,那很糟糕。不幸的是,这是我目前唯一的想法,但如果有另一个想法出现在我的脑海里,我会告诉你。和@DanBracuk感谢一堆:) –

2

如果您不能修改表格,除非您可以修改修改表格的应用程序,否则无法完成此操作。如果你可以做后者,请制作第二张表格:

TreeID NUMBER (foreign key) 
LastModifiedDate datetime 

并且每当第一张表被修改时写入这个表。然后,您可以加入两个表一起

TableA.TreeID = Table2.TreeID 
WHERE Table2.LastModifiedDate >= DATEADD(d, -30, getdate()) 

这将返回在过去30天内修改的所有记录。

如果您无法修改数据库或应用程序,那么对于您当前的结构来说这是不可能的,所以希望您有能力进行一些更改。

编辑:

如果历史变化的东西,你将需要在未来以跟踪其他用途,你应该考虑实施数据仓库(具体而言,考虑慢慢改变尺寸)。

第二个编辑:

我会认真质疑你为什么不允许一个字段添加到该表。在SQL Server中,您可以向表中添加字段而不会影响访问它的数据或应用程序。如果我是你,我会非常努力地将该字段添加到表中,而不是无缘由地创建更复杂和模糊的数据库/应用程序结构。

+0

Ohk谢谢。这将工作。:) – Aishwarya

+0

@Aishwarya不客气。请upvote任何答案,帮助你,并记住接受最能帮助你的答案。欢迎来到论坛,祝你好运! –

相关问题