Estive procurando o dia todo, mas não consegui encontrar uma resposta para isso:
Tenho uma tabela no SQL Server:
dbo.Program
com campos:
- Program.id ... Autoincremento de PK
- Program.user ... varchar
- Program.program ... varchar
- Program.installed ... boolean
- Program.department ... varchar
- Programa.quando instalado ... data
Agora, Desejo inserir um novo registro para cada usuário distinto e copiar o departamento de seu registro mais recente (Programa.quando instalado) com outros valores iguais para cada usuário:
- Program.user ...cada usuário único
- Program.program ... MyMostAwesomeProgram
- Program.installed ... false
- Program.department ...departamento do registro com o último programa. campo quando instalado de todos os registros do usuário único em program.user
- Program.wheninstalled ... null
Eu sei fazer de uma maneira feia:
- selecione os registros mais recentes para cada usuário e seu departamento nesse registro
- extrair valores de 1) e torná-lo em insertem (campo1, campo2 ... campoX) valores (1records_value1, 1records_value2 ... 1records_valueX), (2records_value1, 2records_value2 ... 2records_valueX), ... (Nrecords_value1, Nrecords_value2 ... Nrecords_valueX)
mas gostaria de saber como fazer da melhor forma. Oh, eu não posso usar um banco de dados de RH adequado para tornar minha vida mais fácil, então é com isso que eu tenho que trabalhar agora.
Respostas:
1 para resposta № 1Sou um cara do postgres, mas algo parecido com o abaixo deve funcionar:
insert into Program (user, program, installed, department, wheninstalled)
select user,
"MyMostAwesomeProgram",
false,
(select department from someTable where u.user = ...),
null
from users as u;
a partir de https://stackoverflow.com/a/23905173/3430807
1 para resposta № 2
você disse que sabe como fazer o select
insert into Program (user, program, installed, department, wheninstalled)
select user, "MyMostAwesomeProgram", "false" , department, null
from ...
1 para resposta № 3
Isso deve servir:
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
O pouco interessante é o row_number() over (partition by user order by whenInstalled desc, id desc) r
.
Diz para retornar uma coluna, r
, que contém os valores 1..n para cada user
, contando de acordo com a cláusula order by (ou seja, começando com o mais recente whenInstalled
e trabalhando para trás).
Eu também incluí o id
campo da cláusula order by caso ocorram duas instalações para o mesmo usuário na mesma data; em tal caso, o mais recentemente adicionado (aquele com o maior id
é usado primeiro).
Em seguida, colocamos isso em uma subconsulta e selecionamos apenas o primeiro registro; portanto, temos 1 registro por usuário, e é o mais recente.
Os únicos valores que usamos neste registro são os user
e department
Campos; tudo o mais é definido por seus padrões.
0 para a resposta № 4
Vou responder isso para outras pessoas que podem pesquisar no Google:
- Para obter registros de uma tabela para outra, você precisa usar Selecione em declaração
- Eu gosto de usar Com XXX as (alguns selecionam) para especificar, digamos, a tabela "virtual" com a qual você pode trabalhar durante a consulta
- Como JohnLBevan entendeu uma função muito útil Row_number, sobre, partição por e o que eu perdi é um classificação
Assim, depois de ler sobre isso, você será capaz de entender como fazer o que eu queria fazer.