2016-05-13 66 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;