Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2014, 15:44   #1
Constellation
Пользователь
 
Регистрация: 14.11.2007
Сообщений: 61
По умолчанию Update

Добрый вечер
Есть две таблицы:
Код:
create table #t(name varchar(20),A_1 varchar(10),B_1 varchar(10),C_1 varchar(10),
				A_2 varchar(10),B_2 varchar(10),C_2 varchar(10),
				A_3 varchar(10),B_3 varchar(10),C_3 varchar(10),)

insert into #t(name,A_1,B_1,C_1,A_2,B_2,C_2,A_3,B_3,C_3)values('AAA','','','','','','','','','')
insert into #t(name,A_1,B_1,C_1,A_2,B_2,C_2,A_3,B_3,C_3)values('BBB','','','','','','','','','')

create table #tt(name varchar(20),t_date smalldatetime, QQ varchar(10),WW varchar(10),RR varchar(10))

insert into #tt(name,t_date,QQ,WW,RR)values('AAA','2014.12.01','111','222','aaa')
insert into #tt(name,t_date,QQ,WW,RR)values('BBB','2014.12.01','333','444','sss')
insert into #tt(name,t_date,QQ,WW,RR)values('AAA','2014.12.02','555','666','ccc')
insert into #tt(name,t_date,QQ,WW,RR)values('BBB','2014.12.02','777','888','rrr')
insert into #tt(name,t_date,QQ,WW,RR)values('AAA','2014.12.03','999','123','asd')

select * from #t
select * from #tt
В таблице #t в имени столбцов указана цифра, которая соответствует дню даты из поля t_date таблицы #tt. Мне нужно заполнить таблицу #t данными из второй таблицы таким образом, чтобы данные из столбцов QQ,WW,RR попали в соответствующие столбцы первой таблицы, то есть, например, для AAA от 2014.12.01 из #tt значение QQ должно попасть в столбец A_1, значение WW – в В_1, значение RR – в С_1, для этого же ААА за 2014.12.02 – в столбцы A_2, B_2,C_2, соответственно и т.д.
Пытаюсь запихать это в цикл, но все зависает.

Код:
declare @i char(2)
declare @col1_name nvarchar(20)
declare @col2_name nvarchar(20)
declare @col3_name nvarchar(20)
declare @date1 smalldatetime
declare @date2 smalldatetime

set @date1='2014.12.01'
set @date2='2014.12.05'
set @i=1

while (@i<4)
 set @col1_name=cast('A_'+@i as varchar(20))
 set @col2_name=cast('B_'+@i as varchar(20))
 set @col3_name=cast('C_'+@i as varchar(20)) 
begin
 update #t
   set   @col1_name=#tt.QQ,
	   @col2_name=#tt.WW,
	   @col3_name=#tt.RR
   from #t
   join #tt on #t.name=#tt.name and #tt.t_date between @date1 and @date2 and day(#tt.t_date)=@i


    set @i=@i+1

end;

--drop table #t
--drop table #tt
Подскажите, пожалуйста, что я делаю не так. И вообще, можно ли указывать имена столбцов через переменные? Если нет, может есть какой-то другой способ update, чтобы не прописывать каждый столбец отдельно, их будет не 3………
Constellation вне форума Ответить с цитированием
Старый 17.12.2014, 15:58   #2
Constellation
Пользователь
 
Регистрация: 14.11.2007
Сообщений: 61
По умолчанию

в конце
Код:
join #tt on #t.name=#tt.name and #tt.t_date between @date1 and @date2 and day(#tt.t_date)=right(('0'+@i),2)
Constellation вне форума Ответить с цитированием
Старый 17.12.2014, 16:07   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

MS SQL похоже?
Цитата:
И вообще, можно ли указывать имена столбцов через переменные?
Можно, такие запросы формируются динамически - в строку собирается запрос и выполняется с помощью EXEC (@stroka). По другому ни как
Цитата:
Если нет, может есть какой-то другой способ update, чтобы не прописывать каждый столбец отдельно
Придется прописывать каждый. Можно так например
Код:
UPDATE table1
  SET a1=(SELECT ...),
      a2=(SELECT ...),...,
      an=(SELECT ...)
Цитата:
их будет не 3
бр-р. Может структуру поменять?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.12.2014, 16:13   #4
Constellation
Пользователь
 
Регистрация: 14.11.2007
Сообщений: 61
По умолчанию

к сожалению, структуру поменять нельзя
Constellation вне форума Ответить с цитированием
Старый 17.12.2014, 22:00   #5
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Вникал мало, но явные косяки хотелось бы отметить:
Цитата:
Пытаюсь запихать это в цикл, но все зависает.
Код:
while (@i<4)
 set @col1_name=cast('A_'+@i as varchar(20))
 set @col2_name=cast('B_'+@i as varchar(20))
 set @col3_name=cast('C_'+@i as varchar(20)) 
begin
Налицо непонимание "операторных скобок" - begin должен быть сразу после while

Структуру поменять нельзя - странное заявление, при временных-то таблицах, хотя допускаю что временные они для примера, и типа подобны реальным. Ну тут собственно можно во временных замутить грамотную структуру и запрос сделать на грамотных временных таблицах, а потом на реальные по чёткой структуре перенести.

Можно юзать динамический sql, как уже сказал Аватар, можно попробовать как-то через вьюхи (которые нагенерить или накопипастить).
Также задача очень неплохо ложится на UNPIVOT, но там надо покорпеть. Также думаю, можно вполне сносно разрулить через xml, но тоже надо бы иметь набитую руку.
phomm вне форума Ответить с цитированием
Старый 18.12.2014, 09:01   #6
Constellation
Пользователь
 
Регистрация: 14.11.2007
Сообщений: 61
По умолчанию

ясно. спасибо
Constellation вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Update Diana528 Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 5 13.04.2014 15:38
update kilogram SQL, базы данных 1 27.06.2012 16:33
update Margana PHP 1 01.05.2011 19:55
Update usmesn PHP 3 02.06.2010 17:23
update shad0w SQL, базы данных 3 27.10.2009 11:44