Какова ваша конечная мотивация?Если вы действительно обнаружите, что должны это сделать, возможно, вы захотите пересмотреть свой дизайн.Но, просто для удовольствия:
Во-первых, давайте на самом деле создадим эти таблицы:
create table #table1 (
ID int identity(1,1),
n1 int, n2 int, n3 int, n4 int,
n5 int, n6 int, n7 int, n8 int
);
insert #table1 values
(1,2,3,4,5,6,7,8),
(5,6,7,8,9,10,11,12),
(9,10,11,12,13,14,15,16);
create table #table2 (
ID int identity(1,1),
n1 int, n2 int, n3 int, n4 int
);
insert #table2 values
(1,2,3,4),
(3,4,5,6),
(7,8,9,10);
Теперь вертикализуем с помощью unpivot, чтобы все значения были в одном столбце:
declare @verticalized table (
tbl int,
id int,
col char(2),
val int
);
insert @verticalized
select 1 tbl, id, col, val
from #table1
unpivot (val for col in (n1,n2,n3,n4,n5,n6,n7,n8)) up
union all
select 2, id, col, val
from #table2
unpivot (val for col in (n1,n2,n3,n4)) up
Затем сделайте несколько обобщений, чтобы ответить на ваши вопросы.
select val,
tbls = count(distinct tbl), -- # of tables value is in
cols = count(distinct col), -- # of columns value is in
-- specific locations you can find the value
locations = stuff((
select
distinct ',T' + convert(char(1),tbl) + '.C' + col
from @verticalized sub
where sub.val = v.val
for xml path('')
),1,1,'')
from @verticalized v
group by val
Вы упоминаете присутствие, в частности, в 'field1'.Вы, вероятно, можете работать с кодом оттуда.