Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Подправить запрос c insert`ами  [new]
exw777
Member

Откуда:
Сообщений: 41
Имеется вот такой рабочий запрос:
insert into
  changes.dbo.H_change_def

select
  '1',  --MAX(hc_id)+1 FROM changes.dbo.H_change_def hc_id,
  addall.m_id m_id,
  '1',  --ROW_NUMBER() over (PARTITION BY mid_instance ORDER BY mid_instance ) mid_instance,
  '1',  --MAX(hc_t) FROM changes.dbo.T_checktime hc_t, 
  'Клавиатура' hw_type,
  'ADD' ch_type,
  'ТИП:'+addall.kbd_type+' ЗНАЧЕНИЕ:'+addall.kbd_hwid ch_value

from
  (select * from snapshot.dbo.H_keyboard_temp except select * from snapshot.dbo.H_keyboard) as addall
where exists 
  (select * from CM_CM1.dbo.System_DATA as sd where addall.m_id = sd.MachineID)

Как привести к рабочему виду:
insert into
  changes.dbo.H_change_def

select
  MAX(hc_id)+1 FROM changes.dbo.H_change_def hc_id,
  addall.m_id m_id,
  ROW_NUMBER() over (PARTITION BY mid_instance ORDER BY mid_instance ) mid_instance,
  MAX(hc_t) FROM changes.dbo.T_checktime hc_t, 
  'Клавиатура' hw_type,
  'ADD' ch_type,
  'ТИП:'+addall.kbd_type+' ЗНАЧЕНИЕ:'+addall.kbd_hwid ch_value

from
  (select * from snapshot.dbo.H_keyboard_temp except select * from snapshot.dbo.H_keyboard) as addall
where exists 
  (select * from CM_CM1.dbo.System_DATA as sd where addall.m_id = sd.MachineID)

Где первый коммент из первого запроса был - порядковый номер строки
Второй коммент - номер встречания m_id из текущей таблицы
Третий коммент - максимальное значение одного из столбцов другой таблицы
Помогите разобраться

К сообщению приложен файл. Размер - 14Kb
7 апр 14, 12:32    [15842660]     Ответить | Цитировать Сообщить модератору
 Re: Подправить запрос c insert`ами  [new]
Кавказ-сила
Member

Откуда: Москва
Сообщений: 261
exw777
MAX(hc_id)+1
http://msdn.microsoft.com/en-US/library/ms186775.aspx
7 апр 14, 12:43    [15842738]     Ответить | Цитировать Сообщить модератору
 Re: Подправить запрос c insert`ами  [new]
exw777
Member

Откуда:
Сообщений: 41
Кавказ-сила,
сделал, осталось такое
insert into
  changes.dbo.H_change_def

select
  addall.m_id m_id,
  ROW_NUMBER() over (PARTITION BY mid_instance ORDER BY mid_instance ) mid_instance,
  '1',  --MAX(hc_t) FROM changes.dbo.T_checktime hc_t, 
  'Клавиатура' hw_type,
  'ADD' ch_type,
  'ТИП:'+addall.kbd_type+' ЗНАЧЕНИЕ:'+addall.kbd_hwid ch_value

from
  (select * from snapshot.dbo.H_keyboard_temp except select * from snapshot.dbo.H_keyboard) as addall
where exists 
  (select * from CM_CM1.dbo.System_DATA as sd where addall.m_id = sd.MachineID)

почему ругается на mid_instance?

К сообщению приложен файл. Размер - 30Kb
7 апр 14, 13:27    [15843090]     Ответить | Цитировать Сообщить модератору
 Re: Подправить запрос c insert`ами  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31868
exw777
почему ругается на mid_instance?
А точно в таблицах snapshot.dbo.H_keyboard_temp и snapshot.dbo.H_keyboard есть такое поле?
7 апр 14, 13:33    [15843139]     Ответить | Цитировать Сообщить модератору
 Re: Подправить запрос c insert`ами  [new]
exw777
Member

Откуда:
Сообщений: 41
alexeyvg,

нет, оно есть в результируемой, вот я и думаю как сделать insert from из нескольких таблиц сразу,в т.ч. и из результируемой
7 апр 14, 13:38    [15843175]     Ответить | Цитировать Сообщить модератору
 Re: Подправить запрос c insert`ами  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31868
exw777
alexeyvg,

нет, оно есть в результируемой, вот я и думаю как сделать insert from из нескольких таблиц сразу,в т.ч. и из результируемой
"PARTITION BY mid_instance ORDER BY mid_instance" - откуда сервер возьмёт mid_instance для этих операций?

Вы строите mid_instance по самой себе? :-)
7 апр 14, 14:07    [15843498]     Ответить | Цитировать Сообщить модератору
 Re: Подправить запрос c insert`ами  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31868
exw777
alexeyvg,

нет, оно есть в результируемой, вот я и думаю как сделать insert from из нескольких таблиц сразу,в т.ч. и из результируемой
Вот поэтому тут советуют всегда перечислять поля и использовать алиасы даже в запросах с одной таблицей, что бы вам самому было понятно, что откуда берётся.
7 апр 14, 14:08    [15843514]     Ответить | Цитировать Сообщить модератору
 Re: Подправить запрос c insert`ами  [new]
exw777
Member

Откуда:
Сообщений: 41
alexeyvg,

declare @max int;
select @max = max(T_checktime.ch_t) from changes.dbo.T_checktime;
insert into changes.dbo.H_change_def
select
  addall.m_id m_id,
???      ROW_NUMBER() over (PARTITION BY two.m_id ORDER BY two.m_id ) mid_instance,
  @max, 
  'Клавиатура' hw_type,
  'ADD' ch_type,
  addall.kbd_type+' , '+addall.kbd_hwid ch_value
from (select * from snapshot.dbo.H_keyboard_temp except select * from snapshot.dbo.H_keyboard) as addall 
???       full join changes.dbo.H_change_def as two on 1=1
where exists (select * from CM_CM1.dbo.System_DATA as sd where addall.m_id = sd.MachineID)

Максимальное значение получил через переменную, а с сортировкой не понимаю в чем проблема, за один запрос можно это решить?
результирующую таблицу обозначил как two, и еще вопрос, последний where exists он на своем месте стоит? С учетом что ранее более простой запрос выглядел

from (select * from snapshot.dbo.H_keyboard_temp except select * from snapshot.dbo.H_keyboard) as addall 
where exists (select * from CM_CM1.dbo.System_DATA as sd where addall.m_id = sd.MachineID)


К сообщению приложен файл. Размер - 46Kb
7 апр 14, 14:49    [15843861]     Ответить | Цитировать Сообщить модератору
 Re: Подправить запрос c insert`ами  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31868
exw777
Максимальное значение получил через переменную, а с сортировкой не понимаю в чем проблема, за один запрос можно это решить?
В запросе вместо @max можно написать:
(select max(T_checktime.ch_t) from changes.dbo.T_checktime)
Но можно и через переменную, неважно.

С сортировкой непонятен вопрос.
Это выражение мне непонятно:
ROW_NUMBER() over (PARTITION BY two.m_id ORDER BY two.m_id ) mid_instance,

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

Вы для начала сформулируйте на русском языке, чему должно быть равно получаемое вами поле mid_instance, тогда можно будет решить, как это написать.
exw777
и еще вопрос, последний where exists он на своем месте стоит? С учетом что ранее более простой запрос выглядел
Да.

Но full join выглядит подозрительно, непронятно, что вы этим хотели сказать.
8 апр 14, 01:31    [15846808]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить