SQL - вставить несколько записей из выбора

Я искал весь день, но не смог найти ответ на этот вопрос:

У меня есть таблица на SQL Server:

dbo.Program

с полями:

  • Program.id... ПК автоинкремент
  • Program.user... VARCHAR
  • Program.program... VARCHAR
  • Program.installed... булево
  • Program.department... VARCHAR
  • Program.wheninstalled... дата

Теперь я хочу вставить новую запись для каждого отдельного пользователя и скопировать отдел из его последней (Program.wheninstalled) записи с другими значениями, одинаковыми для каждого пользователя:

  • Program.user...каждый уникальный пользователь
  • Program.program... MyMostAwesomeProgram
  • Program.installed... ложь
  • Program.department...отдел записи с последним program.wheninstalled поле всех записей уникального пользователя в program.user
  • Program.wheninstalled... нуль

Я знаю, как это сделать безобразно

  1. выберите последние записи для каждого пользователя и его отдела в этой записи
  2. извлечь значения из 1) и вставить их в (field1, field2...fieldX) значения (1records_value1, 1records_value2...1records_valueX), (2records_value1, 2records_value2...2records_valueX), ... (Nrecords_value1, Nrecords_value2...Nrecords_valueX)

но я хотел бы знать, как сделать это лучше. О, я не могу использовать какую-то правильную базу данных HR, чтобы облегчить мою жизнь, так что теперь я должен работать с этим.

4 ответа

Вы сказали, что знаете, как сделать выбор

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, 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считая в соответствии с порядком по пунктам (т.е. начиная с самого последнего whenInstalled и работает в обратном направлении).

Я также включил id поле в заказе по пункту в случае, если в одну и ту же дату было выполнено две установки для одного и того же пользователя; в таком случае последний добавленный (тот, с более высоким id используется в первую очередь).

Затем мы помещаем это в подзапрос и выбираем только первую запись; таким образом, у нас есть 1 запись на пользователя, и это самая последняя запись.

Единственными значениями, которые мы используем из этой записи, являются user а также department поля; все остальное определяется по умолчанию.

Я парень из 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;

с /questions/33574378/tsql-insert-into-select-otobrazhat-stroki/33574386#33574386

Так что я собираюсь ответить на это для некоторых других людей, которые могут гуглить это:

  1. Чтобы получить записи из таблицы в другую таблицу, вам нужно использовать команду Выбрать в оператор
  2. Мне нравится использовать With XXX в качестве (некоторые выберите), чтобы указать, скажем, "виртуальную" таблицу, с которой вы можете работать во время запроса
  3. Как JohnLBevan имел в виду очень полезную функцию Row_number, over, partition by и то, что я пропустил, является рангом

Поэтому, прочитав их, вы сможете понять, как делать то, что я хотел.

Другие вопросы по тегам