Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Concaténer plus de deux tables horizontalement dans SQL Server

Il semble que vous essayez d'affecter les prêts "séquentiellement" aux lignes de la table de famille. L'approche pour résoudre ce problème consiste à obtenir d'abord les bonnes lignes, puis à obtenir les prêts affectés aux lignes.

Les lignes de droite (et les trois premières colonnes) sont :

select f.EmpId, e.Name, f.Relationship
from family f join
     Employee e
     on f.empid = e.empid;

Notez que cela ne met pas de traits d'union dans les colonnes pour les valeurs répétées, il met les valeurs réelles. Bien que vous puissiez organiser les traits d'union dans SQL, c'est une mauvaise idée. Les résultats SQL se présentent sous la forme de tableaux, qui sont des ensembles non ordonnés avec des valeurs pour chaque colonne et chaque ligne. Lorsque vous commencez à mettre des traits d'union, vous dépendez de l'ordre.

Maintenant, le problème est de rejoindre les prêts. C'est en fait assez simple, en utilisant row_number() pour ajouter une join clé :

select f.EmpId, e.Name, f.Relationship, l.LoanId
from Employee e left join
     (select f.*, row_number() over (partition by f.EmpId order by (select NULL)) as seqnum
      from family f
     ) f 
     on f.empid = e.empid left join
     (select l.*, row_number() over (partition by l.EmpId order by (select NULL)) as seqnum
      from Loan l
     ) l
     on f.EmpId = l.EmpId and f.seqnum = l.seqnum;

Notez que cela ne garantit pas l'ordre d'attribution des prêts pour un employé donné. Vos données ne semblent pas contenir suffisamment d'informations pour gérer une affectation plus cohérente.