2016-09-30 139 views
-1

多个记录,我一直都在一天寻找,但找不到答案是:SQL - 插入从选择

我有SQL Server上的表:

dbo.Program

与字段:

  • Program.id ... PK自动递增
  • Program.user ... VARCHAR
  • Program.program ... VARCHAR
  • Program.installed ...布尔
  • Program.department ... VARCHAR
  • Program.wheninstalled ...日期

现在,我想插入一个新的记录每一个不同的用户,并从他的最新(Program.wheninstalled)记录复制该部门与其他值同样为每一位用户:

  • Program.user ... 每一个独特的用户
  • Program.program ... MyMostAwesomeProgram
  • Program.installed ......假
  • Program.department ... 部门备案的与所有最新的program.wheninstalled场在program.user
  • Program.wheninstalled独特的用户记录...空

我知道该怎么做,在一个丑陋的方式:

  1. 在这个纪录从1
  2. 提取值)选择为每一位用户的最新记录及其部门并使之成为INSERT INTO (字段1,字段2 ... fieldX)值 (1records_value1,1records_value2 ... 1records_valueX), (2records_value1,2records_value2 ... 2records_valueX), ... (Nrecords_value1,Nrecords_value2 ... Nrecords_valueX)

,但我想知道如何做一个更好的办法。哦,我不能使用一些适当的人力资源数据库来让我的生活更轻松,所以这就是我现在需要的。

回答

1

你说你知道该怎么做选择

insert into Program (user, program, installed, department, wheninstalled) 
select user, 'MyMostAwesomeProgram', 'false' , department, null 
from ... 
1

我是一个Postgres的家伙,但低于一些类似于在应该工作:

insert into Program (user, program, installed, department, wheninstalled) 
select user, 
    'MyMostAwesomeProgram', 
    false, 
    (select department from someTable where u.user = ...), 
    null 
from users as u; 

https://stackoverflow.com/a/23905173/3430807

1

这应该这样做:

insert into Program (user, program, installed, department, whenInstalled) 
select user, program, installed, department, whenInstalled 
from 
(
    select User 
    , 'MyMostAwesomeProgram' program 
    , 0 installed 
    , department 
    , null whenInstalled 
    , row_number() over (partition by user order by whenInstalled desc, id desc) r 
from Program 
) p 
where p.r = 1 

有趣的是row_number() over (partition by user order by whenInstalled desc, id desc) r

这是说,返回一列,r,持有值1..n的每个user,根据order by子句向上计数(即开始与最近whenInstalled和向后工作)。

我还在order by子句中包含id字段,以防在同一日期有两次安装同一用户;在这种情况下,最近添加的(首先使用更高的id)。

然后我们把它放在一个子查询中,并且只选择第一条记录;因此我们每个用户有1条记录,这是最近的记录。

我们在此记录中使用的唯一值是userdepartment字段;所有其他都是按照您的默认值定义的。

+0

ps。如果您想阅读这篇文章,可以在这里找到关于这个类似功能的好博客。 http://blog.sqlauthority.com/2007/10/09/sql-server-2005-sample-example-of-ranking-functions-row_number-rank-dense_rank-ntile/ – JohnLBevan

+1

非常感谢。你的查询最终帮助我完成了它。现在我明白了分区vs vs分组,这些简短的别名,最后我使用了一些排名函数,因为您的查询只返回一行。但与排名它完美的作品:]。无论如何,对于那些可能谷歌这一点: –

0

所以我要回答这对于谁可能google一下其他一些人:

  1. 要想从表中的记录,您需要使用另一台选择为声明
  2. 我喜欢用随着 XXX的(部分选择)来指定,说,“虚拟”的表,你可以查询
  3. 期间工作作为JohnLBevan meantioned一个非常有用的功能ROW_NUMBER分区由什么我错过了一个排名

所以一旦你对这些阅读,你应该能够理解如何做我想做的事。