2016-05-13 71 views
1

由于我是Oracle SQL新手,我需要帮助。 我希望在我的数据库中创建一个新的员工表 - 从我的原始表中获取数据并在'日期'中创建新数据。Oracle DB - 基于日期创建最新数据的新员工表

示例: 我的一名员工更改了姓氏,我希望用他/她的最新数据输入创建我的表格。

table1_raw与 列PNBR; fname; lname; 日期

197001014688 ;Eva ;Andersson ;20150501 
197001014688 ;Eva ;Sandsten ;20160501 
198401011133 ;Peter ;Larsson ;20150102 
198401011133 ;Peter ;Larsson ;20160102 
194408011237 ;Sven ;Hansson ;20130203 

表2与 列PNBR; fname; lname; 日期

197001014688 ;Eva ;Sandsten ;20160501 
198401011133 ;Peter ;Larsson ;20160102 
194408011237 ;Sven ;Hansson ;20130203 

在SQL Server我用下面的查询,与通用表表达式:

;WITH CTE as 
(SELECT RN = ROW_NUMBER() OVER (PARTITION BY pnbr ORDER BY date DESC), 
    pnbr, 
    fname, 
    lname 
FROM table1_raw) 
SELECT 
    fname, 
    lname, 
    pnbr 
INTO 
    table2 
FROM 
    CTE 
WHERE 
    RN = 1 

我怎样写在甲骨文的SQL此查询? 有没有更高效/更简单的方法来做到这一点?

回答

0

在Oracle查询看起来就像这样 -

insert into table2 
select t.pnbr, t.fname, t.lname, t.date 
from table1 t 
inner join (
    select pnbr, max(date) as MaxDate 
    from table1 tm 
    group by username 
) tm on t.username = tm.username 
and t.date = tm.MaxDate 
0

要创建基于一个选择你需要使用Oracle create table as(和标准SQL)

使用rn = ...定义列的表别名也是无效的(标准)SQL,您需要使用... AS rn

最后,;到语句的末尾,而不是在的前面关键字:

create table table2 
as 
WITH CTE as (
    SELECT ROW_NUMBER() OVER (PARTITION BY pnbr ORDER BY date DESC) as rn, 
     pnbr, 
     fname, 
     lname 
    FROM table1_raw 
) 
SELECT fname, 
     lname, 
     pnbr 
FROM cte 
WHERE rn = 1;