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

Откуда:
Сообщений: 1
Есть две таблицы 1) CLR_ParamLinkMap 2) TableTagValues
Картинка с другого сайта.

Из них требуется сделать третью со столбцами PropertyName
Картинка с другого сайта.

В голову пришел только 1 вариант с курсором внутри курсора, либо курсор и вставка значений через селекты:
use TestDB

if(object_id('[Tempdb].[dbo].[#t0]') is not null) drop table [#t0]
	create table [#t0]
	(
		ID varchar(max)
		,ObjParamID varchar(max)
		,ClrParamName varchar(max)
		,Value varchar(max)
		,ItemName varchar(max)
		,MainItemName varchar(max)
		,PropertyName varchar(max)
		,TimeStamp varchar(max)	
	)

insert into #t0
select distinct * from CLR_ParamLinkMap c
inner join TableTagValues as t on t.MainItemName = c.ClrParamName
order by c.ID

if(object_id('[Tempdb].[dbo].[#t1]') is not null) drop table [#t1]
	create table [#t1]
	(
		prop1 varchar(max)
		,prop2 varchar(max)
		,prop3 varchar(max)
		,prop4 varchar(max)
		,prop5 varchar(max)
		,prop6 varchar(max)
		,prop7 varchar(max)
		,prop8 varchar(max)
		,prop9 varchar(max)
		,ID varchar(max)
		,ObjParamID varchar(max)		
	)

DECLARE @ID varchar(max)
declare @ObjParamID varchar(max)

DECLARE @CURSOR CURSOR

SET @CURSOR  = CURSOR SCROLL
FOR  
select distinct c.ID, c.ObjParamID from CLR_ParamLinkMap c
inner join TableTagValues as t on t.MainItemName = c.ClrParamName
order by c.ID 

OPEN @CURSOR   
FETCH NEXT FROM @CURSOR INTO @ID, @ObjParamID  

WHILE @@FETCH_STATUS = 0   
BEGIN   
       insert #t1(prop1,prop2,prop3,prop4,prop5,prop6,prop7,prop8,prop9, ID,ObjParamID)
	   Values( (select distinct Value from #t0 where PropertyName = 'prop1' and ID = @ID and ObjParamID = @ObjParamID)
			  ,(select distinct Value from #t0 where PropertyName = 'prop2' and ID = @ID and ObjParamID = @ObjParamID)
			  ,(select distinct Value from #t0 where PropertyName = 'prop3' and ID = @ID and ObjParamID = @ObjParamID)
			  ,(select distinct Value from #t0 where PropertyName = 'prop4' and ID = @ID and ObjParamID = @ObjParamID)
			  ,(select distinct Value from #t0 where PropertyName = 'prop5' and ID = @ID and ObjParamID = @ObjParamID)
			  ,(select distinct Value from #t0 where PropertyName = 'prop6' and ID = @ID and ObjParamID = @ObjParamID)
			  ,(select distinct Value from #t0 where PropertyName = 'prop7' and ID = @ID and ObjParamID = @ObjParamID)
			  ,(select distinct Value from #t0 where PropertyName = 'prop8' and ID = @ID and ObjParamID = @ObjParamID)
			  ,(select distinct Value from #t0 where PropertyName = 'prop9' and ID = @ID and ObjParamID = @ObjParamID) 
			  ,@ID
			  ,@ObjParamID)

       FETCH NEXT FROM @CURSOR INTO @ID, @ObjParamID   
END   

CLOSE @CURSOR   
DEALLOCATE @CURSOR

select * from #t1
drop table #t0
drop table #t1


С точки зрения работоспособности, работает, но при большом объеме таблиц кажется, что будет очень долго.
Подскажите, есть ли более элегантное и простое решение?
6 авг 17, 19:25    [20703721]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с запросом, сделать из двух таблиц третью  [new]
Remind
Member

Откуда: UK
Сообщений: 523
zink,

PIVOT
6 авг 17, 19:34    [20703740]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить