我一整天都在搜索,但找不到答案:
我有一个关于SQL Server的表:
dbo.Program
包含字段:
现在,我想为每个不同的用户插入一条新记录,并从最新的(Program.wheninstalled)记录中复制部门,并为每个用户提供相同的其他值:
我知道如何以丑陋的方式做到这一点:
但我想知道如何以更好的方式做到这一点。哦,我不能使用一些适当的HR数据库来让我的生活更轻松,所以这就是我现在要处理的事情。
答案 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;
答案 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条记录,这是最新的。
我们在此记录中使用的唯一值是id
和user
字段;根据您的默认值定义所有其他内容。
答案 3 :(得分:0)
所以我会为其他可能谷歌的人回答这个问题:
所以,一旦你阅读了这些,你应该能够理解如何做我想做的事。