Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL-从选择中插入多条记录_Sql Server_Database_Multiple Insert - Fatal编程技术网

Sql server SQL-从选择中插入多条记录

Sql server SQL-从选择中插入多条记录,sql-server,database,multiple-insert,Sql Server,Database,Multiple Insert,我搜索了一整天,但找不到答案: 我在SQL Server上有一个表: dbo.程序 带字段: Program.id…PK自动递增 程序。用户…varchar 程序,程序,varchar 程序。已安装…布尔值 计划,部门…瓦查尔 程序。安装时…日期 现在,我想为每个不同的用户插入一条新记录,并从其最新(Program.wheninstalled)记录中复制部门,其他值与每个用户相同: 程序。用户…每个唯一的用户 程序,程序…粘虫程序 程序。已安装…错误 Program.department…

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

我在SQL Server上有一个表:

dbo.程序

带字段:

  • Program.id…PK自动递增
  • 程序。用户…varchar
  • 程序,程序,varchar
  • 程序。已安装…布尔值
  • 计划,部门…瓦查尔
  • 程序。安装时…日期
现在,我想为每个不同的用户插入一条新记录,并从其最新(Program.wheninstalled)记录中复制部门,其他值与每个用户相同:

  • 程序。用户…每个唯一的用户
  • 程序,程序…粘虫程序
  • 程序。已安装…错误
  • Program.department…具有Program.user中唯一用户的所有记录的最新Program.wheninstalled字段的记录部门
  • 程序。安装时…为空
我知道如何用丑陋的方式来做:

  • 为记录中的每个用户及其部门选择最新记录
  • 从1)中提取值并将其插入 (字段1、字段2…字段x)值 (1记录值1,1记录值2…1记录值x), (2记录值1,2记录值2…2记录值x), ... (记录值1、记录值2…记录值X)

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

    你说你知道如何进行选择

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

    我是一名博士后,但类似于以下内容的东西应该会起作用:

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

    这应该可以做到:

    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
    
    有趣的一点是(按用户顺序按whenInstalled desc、id desc划分)r上的
    行编号()

    这意味着返回一列,
    r
    ,该列为每个
    用户
    保存值1..n,并根据order by子句进行计数(即,在安装时从最新的
    开始并向后计算)

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

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


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

    因此我将为其他一些可能使用谷歌搜索的人回答这个问题:

  • 要将记录从一个表传送到另一个表,需要使用SELECTINTO语句
  • 我喜欢使用With XXX as(some select)来指定,比如说,在查询过程中可以使用的“虚拟”表
  • 正如JohnLBevan所说的,一个非常有用的函数Row_number,over,partition by,我遗漏了一个秩

  • 因此,一旦你阅读了这些内容,你就应该能够理解如何做我想做的事情。

    ps。如果你想了解它,这里有一个很好的博客和类似的功能。谢谢。你的询问最终帮了我很大的忙。现在我理解了partition vs group by,这些短别名,最后我使用了一些rank函数,因为您的查询只返回了一行。但在排名上,它的效果非常好。无论如何,对于那些可能用谷歌搜索的人来说: