Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Concatena più di due tabelle orizzontalmente in SQL Server

Sembra che tu stia tentando di assegnare i prestiti "in sequenza" alle righe nella tabella famiglia. L'approccio per risolvere questo problema consiste nell'ottenere prima le righe giuste, quindi ottenere i prestiti assegnati alle righe.

Le righe di destra (e le prime tre colonne) sono:

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

Nota che questo non inserisce i trattini nelle colonne per i valori ripetuti, ma inserisce i valori effettivi. Sebbene tu possa organizzare i trattini in SQL, è una cattiva idea. I risultati SQL sono sotto forma di tabelle, che sono insiemi non ordinati con valori per ogni colonna e ogni riga. Quando inizi a inserire i trattini, dipendi dall'ordine.

Ora il problema è l'adesione ai prestiti. Questo è in realtà abbastanza semplice, usando row_number() per aggiungere un join chiave:

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;

Si noti che ciò non garantisce l'ordine di assegnazione dei prestiti per un determinato dipendente. Sembra che i tuoi dati non dispongano di informazioni sufficienti per gestire un'assegnazione più coerente.