Código SQL:
Ver originalCREATE TABLE #personas(
id INT,
nombre nvarchar(20)
)
INSERT INTO #personas VALUES (1,'LIBRAS')
INSERT INTO #personas VALUES (2,'Camatagua123')----Camatagua123
INSERT INTO #personas VALUES (3,'forosDelWeb')----forosDelWeb
CREATE TABLE #cargos
(
id INT,
nombre nvarchar(20),
descripcion nvarchar(20)
)
INSERT INTO #cargos VALUES (1,'VIGILANTE','vigilar')
INSERT INTO #cargos VALUES (2,'Secretario','trabajos')
INSERT INTO #cargos VALUES (3,'Tester','Test')
CREATE TABLE #cargos_personas
(
id INT,
persona INT,
cargo INT,
desde datetime,
hasta datetime
)
INSERT INTO #cargos_personas VALUES (1,1,2,'2019-03-04',NULL)
INSERT INTO #cargos_personas VALUES (2,3,1,'2018-06-20','2018-09-03')
INSERT INTO #cargos_personas VALUES (3,1,1,'2019-03-04','2019-03-03')
INSERT INTO #cargos_personas VALUES (4,1,1,'2019-03-04','2019-03-03')
INSERT INTO #cargos_personas VALUES (5,1,3,'2019-03-29','2019-04-30')
--Personas con cargo vigente
SELECT t1.id, t1.nombre,t2.cargo, 'Sin Cargo Vigente' AS resultado FROM #personas AS t1
LEFT JOIN (
SELECT * FROM #cargos_personas AS t1
WHERE hasta <= getdate()
) AS t2 ON (t1.id=t2.persona)
WHERE persona IS NOT NULL
UNION ALL
SELECT t1.id, t1.nombre,t2.cargo, 'No ha tenido Cargo' AS resultado FROM #personas AS t1
LEFT JOIN (
SELECT persona,cargo FROM #cargos_personas AS t1
) AS t2 ON (t1.id=t2.persona)
WHERE persona IS NULL
Este es el resultado:
id nombre cargo resultado
1 LIBRAS 1 Sin Cargo Vigente
1 LIBRAS 1 Sin Cargo Vigente
3 forosDelWeb 1 Sin Cargo Vigente
2 Camatagua123 NULL No ha tenido Cargo
Si vemos los datos libras tiene un cargo vigente(cargo 3) y no aparece, solo aparecen los cargos ya vencidos de foros del web y de Libras, libras tuvo 2 veces el cargo y forosdelweb 1