Следующий код демонстрирует, как сопоставить данные на NameId
между таблицами.Предполагается, что добавляемые Name
являются уникальными.Если между входными таблицами есть несколько совпадений NameId
, предпочтение отдается наиболее раннему совпадению.Несколько NameId
совпадений в одной входной таблице отдают предпочтение самым низким Id
.
-- Sample data.
declare @Table1 as Table ( Id Int, Name VarChar(10), NameId Int, Network VarChar(10) );
insert into @Table1 ( Id, Name, NameId, Network ) values
( 5, 'Bob', 4, 'NPOW' ), ( 6, 'Billy', 8, 'BGER' );
select * from @Table1;
declare @Table2 as Table ( Id Int, Name VarChar(10), NameId Int, Network VarChar(10) );
insert into @Table2( Id, Name, NameId, Network ) values
( 3, 'Stan', 2, 'ERFDT' );
select * from @Table2;
declare @Table3 as Table ( Id Int, Name VarChar(10), NameId Int, Network VarChar(10) );
insert into @Table3 ( Id, Name, NameId, Network ) values
( 3, 'Steve', 3, 'FRVS' ),
( 4, 'Steven', 3, 'FRVS' ), -- Note duplicate NameId value.
( 9, 'Stanley', 2, 'VOOT' ); -- Note duplicate NameId value.
select * from @Table3;
declare @ValuesToAdd as Table ( Name VarChar(10), NameId Int, Network VarChar(10) );
insert into @ValuesToAdd ( Name, NameId, Network ) values
( 'Nick', 4, 'RFGH' ), ( 'Tony', 3, 'ESLO' ),
( 'James', 2, 'HUII' ), ( 'Rusty', 3, 'ERNM' );
select * from @ValuesToAdd;
-- Process the data.
declare @Table4 as Table ( Id Int Identity, Name VarChar(10), NameId Int,
NameFromId VarChar(10), Network VarChar(10) );
-- Demonstrate the matching.
select Name, NameId, NameFromId, Network
from (
select VTA.Name, VTA.NameId, N.Name as NameFromId, VTA.Network,
Row_Number() over ( partition by VTA.Name order by NameRank, Id ) as RN
from @ValuesToAdd as VTA inner join ( -- Use left outer join if there might not be a match on NameId .
select Id, Name, NameId, 1 as NameRank from @Table1 union all
select Id, Name, NameId, 2 from @Table2 union all
select Id, Name, NameId, 3 from @Table3 ) as N on N.NameId = VTA.NameId ) as PH
--where RN = 1; -- Pick the match from the earliest table.
-- Insert the results.
insert into @Table4
select Name, NameId, NameFromId, Network
from (
select VTA.Name, VTA.NameId, N.Name as NameFromId, VTA.Network,
Row_Number() over ( partition by VTA.Name order by NameRank, Id ) as RN
from @ValuesToAdd as VTA inner join ( -- Use left outer join if there might not be a match on NameId .
select Id, Name, NameId, 1 as NameRank from @Table1 union all
select Id, Name, NameId, 2 from @Table2 union all
select Id, Name, NameId, 3 from @Table3 ) as N on N.NameId = VTA.NameId ) as PH
where RN = 1; -- Pick the match from the earliest table.
select * from @Table4;