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) и вставить их в (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
Так что я собираюсь ответить на это для некоторых других людей, которые могут гуглить это:
- Чтобы получить записи из таблицы в другую таблицу, вам нужно использовать команду Выбрать в оператор
- Мне нравится использовать With XXX в качестве (некоторые выберите), чтобы указать, скажем, "виртуальную" таблицу, с которой вы можете работать во время запроса
- Как JohnLBevan имел в виду очень полезную функцию Row_number, over, partition by и то, что я пропустил, является рангом
Поэтому, прочитав их, вы сможете понять, как делать то, что я хотел.