я должен сказать ... это немного сумасшедший
Примечание: Я добавил колонку ID в TableA в качестве первичного ключа. Это необходимо для однозначной идентичности строк в differenciate несколько строк с таким же UID & Cifkey
-- Create the table
create table TableA
(
ID int identity,
UID int,
TableName varchar(5),
CifKey int,
a int
)
create table xxx
(
CifKey int,
b int
)
create table yyy
(
CifKey int,
b int
)
create table zzz
(
CifKey int,
b int
)
set nocount on
-- Insert some sample data
insert into TableA select 1, 'xxx', 12345, 1
insert into TableA select 1, 'yyy', 12345, 2
insert into TableA select 1, 'xxx', 12345, 3
insert into TableA select 2, 'zzz', 45678, 4
insert into xxx select 12345, 100
insert into yyy select 12345, 200
insert into zzz select 45678, 300
-- the Dynamic SQL query
declare @sql nvarchar(max)
select @sql = N'SELECT A.a, b = COALESCE('
select @sql = @sql +
+ N'B' + convert(varchar(10), ID) + '.b,'
from TableA
order by ID
select @sql = left(@sql, LEN(@sql) - 1) + ')' + char(13)
select @sql = @sql
+ N'FROM TableA A' + char(13)
; with cte as
(
select *, rn = convert(varchar(10), ID)
from TableA
)
select @sql = @sql
+ N'LEFT JOIN ' + quotename(TableName) + ' AS B' + rn + ' ' + char(13)
+ N'ON A.CifKey = B' + rn + '.CifKey' + char(13)
+ N'AND A.ID = ' + rn + char(13)
from cte
print @sql
exec sp_executesql @sql
set nocount off
-- clean up
drop table TableA
drop table xxx
drop table yyy
drop table zzz
-- The generated Query (print @sql)
SELECT A.a, b = COALESCE(B1.b,B2.b,B3.b,B4.b)
FROM TableA A
LEFT JOIN [xxx] AS B1
ON A.CifKey = B1.CifKey
AND A.ID = 1
LEFT JOIN [yyy] AS B2
ON A.CifKey = B2.CifKey
AND A.ID = 2
LEFT JOIN [xxx] AS B3
ON A.CifKey = B3.CifKey
AND A.ID = 3
LEFT JOIN [zzz] AS B4
ON A.CifKey = B4.CifKey
AND A.ID = 4
Если 'UID = 1' и' Cifkey = 12345', что было бы TableName? –
tablename будет xxx и yyy, спасибо! – Snow
Каков первичный ключ таблицы A? – Squirrel