Un moyen de joindre des tables en utilisant une logique préférentielle sur ID?

J'ai deux tables, toutes deux avec plusieurs ID, dont aucune n'est primaire.

Je voudrais d'abord joindre table2 à table1 sur ID1 si une correspondance existe dans table2. Si aucune correspondance n'existe pour un logging donné, correspondre sur ID2; enfin, si aucune correspondance n'existe sur ID2, correspondre sur ID3.

J'avais commencé à configurer ceci en utilisant une instruction CASE similaire à ce qui suit:

select * from table1 t inner join table2 s on CASE WHEN s.ID1 = t.ID1 THEN s.ID1 = t.ID1 WHEN s.ID2 = t.ID2 THEN s.ID2 = t.ID2 ELSE s.ID3 = t.ID3 END 

mais SQL Server ne semble pas l'aimer.

Des idées sur la façon de mettre quelque chose comme ça?

 declare @table1 table (ID1 int, ID2 int, ID3 int) declare @table2 table (ID1 int, ID2 int, ID3 int) insert into @table1 values (1, 2, 3) insert into @table2 values (1, 1, 1) insert into @table2 values (1, 2, 2) insert into @table2 values (2, 2, 2) insert into @table2 values (3, 3, 3) select * from @table1 t cross apply (select top 1 with ties * from @table2 t2 where t2.ID1 = t.ID1 or t2.ID2 = t.ID2 or t2.ID3 = t.ID3 order by case when t2.ID1 = t.ID1 then 1 when t2.ID2 = t.ID2 then 2 when t2.ID3 = t.ID3 then 3 end) as S 

Résultat:

 ID1 ID2 ID3 ID1 ID2 ID3 ----------- ----------- ----------- ----------- ----------- ----------- 1 2 3 1 1 1 1 2 3 1 2 2 

Essayez de split en casse séparés de chaque côté du =, comme ceci:

 select * from table1 t inner join table2 s on CASE WHEN s.ID1 = t.ID1 then s.ID1 WHEN s.ID2 = t.ID2 THEN s.ID2 ELSE s.ID3 END = CASE WHEN s.ID1 = t.ID1 then t.ID1 WHEN s.ID2 = t.ID2 THEN t.ID2 ELSE t.ID3 END 

Bien que cela ne fonctionne pas bien, cela devrait fonctionner.

La jointure requirejs un résultat boolean. Vous avez juste besoin d'un opérateur de comparaison. Essayer

 inner join table t on CASE WHEN s.ID1 = t.ID1 THEN 1 WHEN s.ID2 = t.ID2 THEN 1 WHEN s.ID3 = t.ID3 THEN 1 ELSE 0 END = 1 

Vous pouvez get de meilleures performances en utilisant 3 jointures et quelques UNIONs, quelque chose de similaire à:

 select * from table1 t inner join table2 s ON s.ID1 = t.ID1 UNION select * from table1 t inner join table2 s ON s.ID1 != t.ID1 AND s.ID2 = t.ID2 UNION select * from table1 t inner join table2 s ON s.ID1 != t.ID1 AND s.ID2 != t.ID2 AND s.ID3 == t.ID3