SQL - 从select中插入多个记录

时间:2016-09-30 19:34:09

标签: sql-server database multiple-insert

我一整天都在搜索,但找不到答案:

我有一个关于SQL Server的表:

dbo.Program

包含字段:

  • Program.id ... PK autoincrement
  • 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. 为该记录中的每个用户及其部门选择最新记录
  2. 从1)中提取值并将其插入到插入中 (field1,field2 ... fieldX)值 (1records_value1,1records_value2 ... 1records_valueX), (2records_value1,2records_value2 ... 2records_valueX), ... (Nrecords_value1,Nrecords_value2 ... Nrecords_valueX)
  3. 但我想知道如何以更好的方式做到这一点。哦,我不能使用一些适当的HR数据库来让我的生活更轻松,所以这就是我现在要处理的事情。

4 个答案:

答案 0 :(得分:1)

你说你知道怎么做选择

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

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

答案 2 :(得分: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,它为每个user保存值1..n,根据order by子句进行计数(即从最近的{{1}开始并向后工作)。

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

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

我们在此记录中使用的唯一值是iduser字段;根据您的默认值定义所有其他内容。

答案 3 :(得分:0)

所以我会为其他可能谷歌的人回答这个问题:

  1. 要从表格获取记录到另一个表格,您需要使用选择语句
  2. 我喜欢使用使用 XXX作为(某些选择)来指定,例如,在查询期间可以使用的“虚拟”表
  3. 正如JohnLBevan所说的非常有用的功能 Row_number over 分区,我错过的是 rank
  4. 所以,一旦你阅读了这些,你应该能够理解如何做我想做的事。