Я вижу две проблемы здесь.Во-первых, это несовместимый тип идентификатора в таблицах 2 и 3 и агрегация ссылочных ключей в таблице 1. Вот пример того, как решить обе проблемы.Чтобы разделить столбец REFERENCE_NUMBER, я использовал функцию STRING_SPLIT.
Обновление: я добавил решение, которое должно работать с SQL Server 2012.
Я предположил, что вы хотите объединить данные из таблицы 1 с 2 или 3 в зависимости от наличия этих данных.Это просто моя идея, чего ты хотел достичь.
-- data preparing
declare @t1 as table(
id int
,data_column varchar(20)
,reference_number varchar(20)
)
declare @t2 as table(
id varchar(20)
,data_column varchar(20)
)
declare @t3 as table(
id int
,data_column varchar(20)
)
insert into @t1 values(1,'some data','1528,ss-456'),(2,'some data','9523'),(3,'some data','ss-952'),(4,'some data',null);
insert into @t2 values('ss-456','some data'),('ss-952','some data');
insert into @t3 values(1528,'some data'),(9523,'some data');
-- Solution example version >= 2016
with base as (
select t1.id,t1.data_column,f1.value from @t1 t1 outer apply string_split(t1.reference_number,',') f1)
select b.id,b.data_column,b.value,t2.data_column from base b join @t2 t2 on b.value = t2.id
union all
select b.id,b.data_column,b.value,t3.data_column from base b join @t3 t3 on try_cast(b.value as int ) = t3.id
union all
select b.id,b.data_column,b.value,null from base b where b.value is null;
-- Solution for SQL Version < 2016
with base as (
select t1.id,t1.data_column,f1.value from @t1 t1 outer apply(
SELECT Split.a.value('.', 'NVARCHAR(MAX)') value
FROM
(
SELECT CAST('<X>'+REPLACE(t1.reference_number, ',', '</X><X>')+'</X>' AS XML) AS String
) AS A
CROSS APPLY String.nodes('/X') AS Split(a)
) f1)
select b.id,b.data_column,b.value,t2.data_column from base b join @t2 t2 on b.value = t2.id
union all
select b.id,b.data_column,b.value,t3.data_column from base b join @t3 t3 on try_cast(b.value as int ) = t3.id
union all
select b.id,b.data_column,b.value,null from base b where b.value is null;