-1

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

我在 SQL Server 上有一个表:

dbo.程序

带字段:

  • Program.id...PK 自动增量
  • Program.user...varchar
  • 程序.程序...varchar
  • Program.installed...布尔值
  • Program.department...varchar
  • Program.wheninstalled...日期

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

  • Program.user...每个唯一用户
  • Program.program...MyMostAwesomeProgram
  • Program.installed...假
  • Program.department... program.user中唯一用户的所有记录的最新记录的部门.wheninstalled 字段
  • Program.wheninstalled...null

我知道如何以一种丑陋的方式做到这一点:

  1. 为该记录中的每个用户及其部门选择最新记录
  2. 从 1) 中提取值并将其插入 (field1, field2...fieldX) 值 (1records_value1, 1records_value2...1records_valueX), (2records_value1, 2records_value2...2records_valueX), ... (Nrecords_value1, Nrecords_value2.. .Nrecords_valueX)

但我想知道如何以更好的方式做到这一点。哦,我不能使用一些适当的人力资源数据库来让我的生活更轻松,所以这就是我现在必须使用的。

4

4 回答 4

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并向后工作)。

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

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

我们从这条记录中使用的唯一值是userdepartment字段;所有其他都是根据您的默认值定义的。

于 2016-09-30T19:48:25.553 回答
1

你说你知道怎么做选择

insert into Program (user, program, installed, department, wheninstalled)
select user, 'MyMostAwesomeProgram', 'false' , department, null 
from ... 
于 2016-09-30T19:41:02.413 回答
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

于 2016-09-30T19:43:55.023 回答
0

所以我要为其他可能在谷歌上搜索的人回答这个问题:

  1. 要将表中的记录获取到另一个表,您需要使用Select into语句
  2. 我喜欢使用With XXX as ( some select) 来指定,比如说,您可以在查询期间使用的“虚拟”表
  3. 正如 JohnLBevan 所指的一个非常有用的函数Row_numberoverpartition by和我错过的是排名

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

于 2016-10-01T13:10:22.950 回答