2015-02-18 1 views
1

У меня есть таблица для хранения таблицы данных от пользователя, как этотSQL-UNION ALL, используя то время как/Еогеасп

______________________ 

ID |tableName | idUser 
______________________ 
1 | data1 | 1 
2 | data2 | 1 
3 | data3 | 2 
4 | data4 | 2 

затем образец для data1 п data2 таблицы, которые имеют то же самое поле

DBO. data1

______________________ 

ID |name  | amount 
______________________ 
1 | abc  | 1 
2 | def  | 1 

dbo.data2

______________________ 

ID |name  | amount 
______________________ 
1 | ghi  | 1 
2 | jkl  | 1 

результат я хочу

______________________ 

ID |name  | amount 
______________________ 
1 | abc  | 1 
2 | def  | 1 
3 | ghi  | 1 
4 | jkl  | 1 

как получить всю таблицу накидной для каждого пользователя (каждый пользователь может иметь более 2 таблицы) так как использовать запрос union для запроса для получения таблицы union для каждого idUser с использованием foreach или while?

нужна помощь, ТНХ

+0

Пахнет плохой дизайн ... –

+0

да. .. но все равно нужна помощь, чтобы получить это – Mike

+0

Объясните, как у вас есть идентификаторы от 1 до 4 в желаемом исходе. Это просто номер строки? Вам нужен желаемый результат только для одного пользователя за раз? – peterm

ответ

1

Вы можете сделать это с помощью Dynamic SQL. Вам просто нужно сгенерировать запрос UNION ALL s и использовать ROW_NUMBER для создания нового ID.

DECLARE @sql2 VARCHAR(MAX) = '' 
DECLARE @sql1 VARCHAR(MAX) = '' 

SELECT @sql1 = @sql1 + CHAR(10) + 
' SELECT * FROM ' + tableName + CHAR(10) + 
' UNION ALL' 
FROM UserTable 
WHERE IdUser = 1 -- @IdUser 

--REMOVE LAST UNION ALL 
SELECT @sql1 = SUBSTRING(@sql1, 1, LEN(@sql1) - 10) 

SELECT @sql2 = 
'SELECT 
    ID = ROW_NUMBER() OVER(ORDER BY Name), 
    Name, 
    Amount 
FROM(' + @sql1 + ')t' 

PRINT @sql2 
EXEC(@sql2) 

Результат PRINT @sql2:

SELECT 
    ID = ROW_NUMBER() OVER(ORDER BY Name), 
    Name, 
    Amount 
FROM(
    SELECT * FROM data1 
    UNION ALL 
    SELECT * FROM data2 
)t 
0

может быть, вы можете продолжить как этот также, чтобы получить требуемый результат

declare @t table (ID INT,tablename varchar(10),Iduser Int) 
insert into @t(ID,tablename,Iduser)values (1,'data1',1) 
insert into @t(ID,tablename,Iduser)values (1,'data2',1) 
insert into @t(ID,tablename,Iduser)values (1,'data3',2) 
insert into @t(ID,tablename,Iduser)values (1,'data4',2) 

declare @t1 table (ID INT,name varchar(10),amount Int) 
insert into @t1(ID,name,amount)values (1,'abc',1) 
insert into @t1(ID,name,amount)values (2,'def',1) 



declare @t2 table (ID INT,name varchar(10),amount Int) 
insert into @t2(ID,name,amount)values (1,'ghi',1) 
insert into @t2(ID,name,amount)values (2,'jkl',1) 

;WITH CTE AS 
(
select DISTINCT t.ID,tt.name AS name ,tt.amount as amount from @t t 

FULL JOIN @t1 tt on tt.ID = t.ID 

UNION ALL 

select DISTINCT t.ID,ttt.name AS name,ttt.amount as amount from @t t 

FULL JOIN @t2 ttt on ttt.ID = t.ID 
) 

Select rank()OVER (PARTITION BY amount order by name)ID,C.name,C.amount from CTE C ORDER BY name 
Смежные вопросы