Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Verketten Sie mehr als zwei Tabellen horizontal in SQL Server

Es sieht so aus, als ob Sie versuchen, die Darlehen "sequenziell" Zeilen in der Familientabelle zuzuweisen. Der Ansatz zur Lösung dieses Problems besteht darin, zuerst die richtigen Zeilen zu erhalten und dann die Kredite den Zeilen zuzuweisen.

Die rechten Zeilen (und die ersten drei Spalten) sind:

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

Beachten Sie, dass dies keine Bindestriche in die Spalten für wiederholte Werte einfügt, sondern die tatsächlichen Werte einfügt. Obwohl Sie die Bindestriche in SQL arrangieren können, ist dies eine schlechte Idee. SQL-Ergebnisse liegen in Form von Tabellen vor, bei denen es sich um ungeordnete Mengen mit Werten für jede Spalte und jede Zeile handelt. Wenn Sie anfangen, Bindestriche einzufügen, sind Sie von der Reihenfolge abhängig.

Jetzt besteht das Problem darin, die Kredite aufzunehmen. Dies ist eigentlich ziemlich einfach, indem Sie row_number() verwenden um einen join hinzuzufügen Schlüssel:

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;

Beachten Sie, dass dies die Reihenfolge der Zuweisung von Darlehen für einen bestimmten Mitarbeiter nicht garantiert. Ihre Daten scheinen nicht genügend Informationen für eine konsistentere Zuordnung zu enthalten.