/ / SQL - Insere vários registros de seleção - sql-server, banco de dados, inserção múltipla

SQL - Insere vários registros de select - sql-server, database, multiple-insert

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:

  1. selecione os registros mais recentes para cada usuário e seu departamento nesse registro
  2. 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 № 1

Sou 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:

  1. Para obter registros de uma tabela para outra, você precisa usar Selecione em declaração
  2. Eu gosto de usar Com XXX as (alguns selecionam) para especificar, digamos, a tabela "virtual" com a qual você pode trabalhar durante a consulta
  3. 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.