MSSQL: unir a la izquierda múltiples columnas en tres tablas
Tengo tres tablas en MS SQL Server:
Tenants:
TenantID int,
LastName varchar(50),
FirstName varchar(50)
Intervals:
Value int,
Name varchar(50)
Leases:
LeaseID int,
Interval int,
StartDate date,
EndDate date,
Tenant1 int,
Tenant2 int,
Tenant3 int,
Tenant4 int
La tabla Intervals tiene tres filas: [1, ‘Mensual’], [2, ‘Quincenal’] y [3, ‘Semanal’]
Necesito una consulta que tenga este conjunto de resultados:
LID Tipo Inicio Fin Inquilino1 Inquilino2 Inquilino3 Inquilino4
21 Mensual 15/12/2019 15/12/2020 Sean Murphy Audrey Moore Randy Davis
32 Semanal 01/06/2018 Pete Higgins Kathy Higgins
35 Mensual 01/08/2019 31/10/2020 Andy Stacke Valerie Stacke
44 Mensual 01/01/2021 Pete O’Toole Martha White
Dejando de lado la columna de nombre y apellido por ahora, mi primer intento utilizó dos uniones izquierdas exitosamente:
select L.LeaseID, I.Name as Tipo, L.StartDate, L.EndDate, T.LastName as Inquilino1
from Leases L
left join Intervals I on I.value=L.Interval
left join Tenants T on T.TenantID = L.Tenant1
y devolvió esto:
LID Tipo Inicio Fin Inquilino1
21 Mensual 15/12/2019 15/12/2020 Murphy
32 Semanal 01/06/2018 Higgins
35 Mensual 01/08/2019 31/10/2020 Stacke
44 Mensual 01/01/2021 O’Toole
Un buen comienzo, pero no parece ser capaz de obtener hasta 4 nombres únicos de la tabla Tenants, y me gustaría combinar (nombre+apellido) en las columnas de inquilinos.
Intenté múltiples uniones izquierdas para la misma tabla (tenants), y condiciones OR en una unión; ambas parecían intuitivamente incorrectas.
select L.lid,L.ruid, I.Name, T.LastName as Inquilino1, T.LastName as Inquilino2 from Leases L
left join Intervals I on I.value=L.Interval
left join Tenants T on T.TenantID = L.Tenant1
left join Tenants T on T.TenantID = L.Tenant2
select L.lid,L.ruid, I.Name, T.LastName as Inquilino1, T.LastName as Inquilino2 from Leases L
left join Intervals I on I.value=L.Interval
left join Tenants T on T.TenantID = L.Tenant1 or T.TenantID = L.Tenant2
Pero ambas consultas devolvieron el mismo apellido en dos columnas.
davy.ai
Para obtener hasta 4 nombres únicos de la tabla Tenants, puedes utilizar subconsultas y la función COALESCE. COALESCE devuelve el primer valor no nulo, por lo que si un campo de Tenant está nulo, pasará al siguiente campo de Tenant hasta que encuentre un valor no nulo.
Aquí está la consulta actualizada:
En esta consulta, estamos uniendo la tabla Tenants cuatro veces, una vez por cada campo de Tenant en la tabla Leases. Estamos utilizando subconsultas para seleccionar solo las columnas TenantID, FirstName y LastName de la tabla Tenants, para evitar confundir las uniones izquierdas al incluir columnas innecesarias.
Luego, en la cláusula SELECT, utilizamos COALESCE para concatenar los nombres y apellidos de cada campo de Tenant en una sola columna, separados por un espacio. Si un campo está nulo, la función COALESCE devolverá una cadena vacía en su lugar.
Con esta consulta, deberías obtener el conjunto de resultados deseado con hasta 4 nombres únicos en cada columna de Tenant.