Oracle DB - 根据日期创建包含最新数据的新员工表

时间:2016-05-13 10:08:09

标签: database oracle common-table-expression

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

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

table1_raw pnbr ;的 FNAME ;的 L-NAME ;的日期

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

table2 pnbr ;的 FNAME ;的 L-NAME ;的日期

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

如何在Oracle SQL中编写此查询? 是否有更有效/更简单的方法来做到这一点?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

要基于SELECT创建表,您需要在Oracle(和标准SQL)中使用create table as

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

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

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;