Database Oracle Flashback数据存档版本查询与联接?

Database Oracle Flashback数据存档版本查询与联接?,database,oracle,join,oracle11g,flashback,Database,Oracle,Join,Oracle11g,Flashback,在这种情况下,我试图从本质上获取数据集在两个时间点之间发生的所有更改的列表。对于Oracle中的VERSIONS BETWEEN关键字,这似乎是一个很好的例子,但我不知道如何有效地连接到其他表并获得我想要的结果 假设我有以下表格: CREATE TABLE emp ( emp_id NUMBER(5) PRIMARY KEY, employee_name VARCHAR2(20) dept_id NUMBER(3) NOT NULL

在这种情况下,我试图从本质上获取数据集在两个时间点之间发生的所有更改的列表。对于Oracle中的VERSIONS BETWEEN关键字,这似乎是一个很好的例子,但我不知道如何有效地连接到其他表并获得我想要的结果

假设我有以下表格:

CREATE TABLE emp (
    emp_id        NUMBER(5) PRIMARY KEY,
    employee_name VARCHAR2(20)
    dept_id       NUMBER(3) NOT NULL
                     CONSTRAINT admin_dept_fkey REFERENCES dept
                     (dept_id))
);

CREATE TABLE dept(
    dept_id    NUMBER(5),
    department VARCHAR2(20)
);
如果员工记录发生更改,我需要能够获得员工记录更改时的部门名称,因为该员工可能仍然属于同一部门,但部门名称在某个时候发生了更改

例如: EMP.VERSIONS\u StartSN EMP\u ID员工姓名部门ID部门 1迈克尔1服务 0 1迈克尔1销售

如果数据库是非规范化的,并且我将部门名称存储在表本身上,这将非常容易;然而,使用查找表似乎使其不那么直观

我尝试过的事情:

SELECT *
FROM emp VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE e
JOIN dept d ON d.dept_id = e.dept_id;
这将使我了解今天的部门,但这并不能告诉我员工记录更改时的部门是什么

SELECT *
FROM emp VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE e
JOIN dept VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE d
ON d.dept_id = e.dept_id;
这也不好,因为它将返回多行,每个部门发生变化的员工一行,而我实际上只希望该部门保持在员工记录发生变化时的状态

SELECT *
FROM emp VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE e
JOIN dept VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE d
ON d.dept_id = e.dept_id;
我还尝试了几个内部选择,但Oracle似乎不允许我在内部查询中使用VERSIONS\u ENDSCN或VERSIONS\u STARTTIME。我尝试过的变化包括:

SELECT 
    versions_startscn,
    e.employee_name,
    (SELECT department FROM dept AS OF SCN versions_startscn d WHERE d.dept_id = e.dept_id)
FROM emp VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE e

SELECT 
    e.employee_name
    (SELECT department FROM dept AS OF SCN versions_startscn d WHERE d.dept_id = e.dept_id)
FROM(
    SELECT 
        versions_startscn,
        e.employee_name,
    FROM emp VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE e
    )
这两个查询都会引发一个错误,即未声明版本\u STARTSCN

我觉得这应该是一个相当常见的用例,但是我还没有找到任何在连接之间使用版本的例子。我想出了一种方法来实现这一点,包括打开一个游标,在SCN MINVALUE和MAXVALUE之间进行员工更改,将SCN选择为一个变量,并将emp表和DEPT AS OF SCN中的更改选择为一个嵌套表类型,但这似乎需要做很多工作,而且看起来相当简单。如果有人有任何想法,我们将不胜感激


我目前正在使用v11.2.0.4。

我几乎有类似的要求

我只能通过检查一个表的版本时间是否介于另一个表的版本时间之间来考虑这样做。另一个表的开始时间和结束时间之间应存在开始时间或结束时间,反之亦然。但这是非常昂贵和缓慢的

nvl(tblB.versions_Endtime,tblB.versions_starttime) >=  tblA.versions_starttime and  nvl(tblB.versions_Endtime,tblB.versions_starttime) <=  nvl(tblA.versions_endtime, to_timestamp('9999-01-01 00:00:00','YYYY-MM-DD HH:MI:SS'))
nvl(tblB.versions\u Endtime,tblB.versions\u starttime)>=tblA.versions\u starttime和nvl(tblB.versions\u Endtime,tblB.versions\u starttime)=tblB.versions\u starttime和

nvl(tblA.versions\u Endtime,tblA.versions\u starttime)您好,您解决了这个问题吗?为了清晰起见,我添加了代码格式,但不清楚“OR”是指两个可选语句,还是一个逻辑或,应该包含哪些语句来生成一个语句。。