由于我是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中编写此查询? 是否有更有效/更简单的方法来做到这一点?
答案 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;