SQL Server: comparez deux tables et renvoyez des lignes similaires

Je veux comparer deux tables, source et cible, et get des lignes similaires.

Comparez la source et la cible sur l' Id un par un et:

  • Si correspond et qu'il y en a deux ou plus sur Cible => select Tout correspond à la cible
    • Si correspond et il est deux ou plus sur Source =>
    • pour la première correspondance si elle n'a pas été sélectionnée avant
      • select Correspondant à partir de la cible
    • else (SI il a déjà été sélectionné)
      • vérifier pour le match suivant

Je pense avoir besoin d'une expression récursive pour vérifier la source et la cible un par un

La source

 x------x---------x | Id | Name | x------x---------x | 1 | a | | 2 | b | | 2 | c | | 3 | d | | 3 | e | | 4 | x | x------x---------x 

Cible

 x------x---------x | Id | Name | x------x---------x | 1 | f | | 1 | g | | 2 | h | | 3 | i | | 3 | j | | 5 | y | x------x---------x 

Résultat

 x------x---------x | Id | Name | x------x---------x | 1 | f | | 1 | g | | 2 | h | | 3 | i | | 3 | j | x------x---------x 

Données de test

 declare @s table(Id int, name varchar(20)) DECLARE @t table( Id int, name varchar(20)) INSERT @s values(1, 'a'), (2, 'b'), (2, 'c'), (3, 'd'), (3, 'e') INSERT @t values(1, 'f'), (1, 'g'), (2, 'h'), (3, 'i'), (3, 'j') 

Je pense que vous avez juste besoin d'un opérateur Exists pour le faire.

 select * from @tt where exists (select 1 from @ss where t.id=s.id) 

SQLFIDDLE DEMO

 SELECT DISTINCT t.Id, t.name FROM SOURCE s INNER JOIN target t ON s.id=t.Id WHERE s.Id IN (SELECT Id FROM target)