2016-09-30 2 views
-1

Я искал весь день, но не смог найти ответ на этот вопрос:SQL - Вставка нескольких записей из выбора

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

dbo.Program

с полями:

  • Program.id ... PK автоинкремент
  • 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)

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

ответ

1

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

insert into Program (user, program, installed, department, wheninstalled) 
select user, 'MyMostAwesomeProgram', 'false' , department, null 
from ... 
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; 

из https://stackoverflow.com/a/23905173/3430807

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, который содержит значение для каждого 1..n user, подсчитывая в соответствии с порядком по п (т.е. начиная с самим последним whenInstalled и работают в обратном направлении).

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

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

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

+0

пс. хороший блог об этом и подобных функциях здесь, если вы хотите прочитать об этом. http://blog.sqlauthority.com/2007/10/09/sql-server-2005-sample-example-of-ranking-functions-row_number-rank-dense_rank-ntile/ – JohnLBevan

+1

Большое спасибо. Ваш запрос помог мне сделать это, наконец,. Теперь я понимаю раздел vs vs group by, те короткие псевдонимы, и в конце я использовал некоторую функцию ранжирования, потому что ваш запрос привел к возврату только одной строки. Но с ранга он отлично работает:]. В любом случае для тех, кто может это сделать google: –

0

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

  1. Чтобы получить записи из таблицы в другую, необходимо использовать Выберите в заявление
  2. Мне нравится использовать с XXX, как (некоторые выбрать), чтобы определить, скажем, «виртуальная» таблица, с которой можно работать при запросе
  3. Как JohnLBevan meantioned очень полезную функцию row_number, над, раздел по и то, что я пропустил это ранг

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

Смежные вопросы