我正在处理Oracle数据库,并且用户犯了错误。问题是一些人的记录被转移到一个不同的“回合”。每一轮都有“剧集”:错误的“圆形”意味着所有剧集处理都受到影响(剧集跳过)。由于错过了“剧集”,这些用户将不会收到他们应该收到的邮件。
我有一个查询放在一起,标识所有错误更新的记录。我需要一种方法来修改查询,以帮助找到错误地移入“第2轮”的所有表。
(我需要识别的所有表格都是具有“round_no”值的表格)
编辑:有70多张桌子!使用“ROUND_NO”COLUMN,我只需要识别其中包含这些人员记录的那些。我还需要获取此数据并将其从错误的第2轮返回第1轮。
这是一个查询,用于识别错误地被“跳过”到第2轮的人:
SELECT p.person_id
, p.name
, ep2.open_date
, ( SELECT pr1.open_date
FROM Person_ep ep1
WHERE ep1.person_id = ep2.person_id
AND er1.round_no = 1 /* SOMETHING IS MISSING WHERE, WHERE IS er1 defined */
)
r1epiopen /* Round 1 episode open date */
FROM person p
join region r
on r.region_code = p.region_code
and r.location_id = 50
join Person_ep er2
ON er2.person_id = p.person_id
AND er2.round_no = 2
ORDER
BY p.person_id
在Oracle 11G RDBMS上使用SQL Developer 3.2.20.09。
答案 0 :(得分:2)
很抱歉看到这篇文章迟到了...希望现在还不晚......
我认为您使用的是Oracle 10+,而且您大约知道犯罪时间(!)。
我看到了两种可能性:
1)使用Log Miner查看执行的SQL:http://docs.oracle.com/cd/B19306_01/server.102/b14215/logminer.htm
2)使用闪回查询来查看过去表格的数据。但对于这个,你需要测试每个可疑的桌子(70+):( http://docs.oracle.com/cd/E11882_01/appdev.112/e41502/adfns_flashback.htm#ADFNS01001
在可疑表上,您可以运行此类SQL以查看更新是否在时间范围内发生:
SELECT versions_startscn,versions_starttime,
versions_endscn,versions_endtime,
versions_xid,versions_operation,
说明
来自my_table
TIMESTAMP TO_TIMESTAMP之间的版本('2014-01-29 14:59:08','YYYY-MM-DD HH24:MI:SS')
和TO_TIMESTAMP('2014-01-29 14:59:36','YYYY-MM-DD HH24:MI:SS')
WHERE id = 1;
我没有使用log miner的实际经验,但我认为这将是最佳解决方案,特别是如果您已激活存档日志:D
您可以使用类似这样的查询在更新之前访问受影响的表的数据值(如果您知道更新的时间):
SELECT COUNT(*) FROM myTable AS OF TIMESTAMP TO_TIMESTAMP('2014-01-29 13:34:12', 'YYYY-MM-DD HH24:MI:SS');
当然,数据只有在可用时才可用(保留在撤消表空间中)。
然后,您可以在更新之前创建包含数据的临时表:
create table tempTableA as SELECT * FROM myTable AS OF TIMESTAMP TO_TIMESTAMP('2014-01-29 13:34:12', 'YYYY-MM-DD HH24:MI:SS');
然后使用来自tempTableA的值更新您的表。
答案 1 :(得分:1)
如果要查找列“round_no”的所有表,您可能应该使用此查询
select table_name from all_tab_columns where column_name='round_no'
答案 2 :(得分:1)
如果您只想获得可以更新的表
SELECT table_name
FROM user_tab_columns c, user_tables t
WHERE c.column_name = 'ROUND_NO'
AND t.table_name = c.table_name;
应该有效
或纯粹主义者
SELECT table_name
FROM user_tab_columns c
JOIN user_tables t ON t.table_name = c.table_name
WHERE c.column_name = 'ROUND_NO';