Solución:
Alternativamente, puede probar el siguiente método:
SELECT
x.*
FROM
(
VALUES
('emp1%', 3),
('emp3%', 2)
) AS v (pattern, row_count)
CROSS APPLY
( -- your query
SELECT top (v.row_count)
employee_id, employee_ident, utc_dt, rx_dt
FROM employee
INNER JOIN employee_mdata_history
ON employee.ident=employee_mdata_history.employee_ident
WHERE employee_id like v.pattern
ORDER BY rx_dt desc
) AS x
;
los VALUES
El constructor de filas representa su lista de patrones como una tabla, y además proporciona a cada patrón el número de filas a recuperar para ese patrón. El operador CROSS APPLY aplica su consulta a cada fila de la lista de patrones, es decir, a cada patrón, limitando el número de filas para cada patrón al valor correspondiente de la lista de patrones.
Como nota al margen, permítame aprovechar esta oportunidad para sugerir que siempre califique sus columnas con el alias de la tabla en una consulta que esté leyendo de dos o más tablas. Eso hace que su consulta sea más fácil de leer / comprender. Siempre puede usar alias cortos para evitar la repetición de nombres de tablas potencialmente largos. Por ejemplo:
SELECT TOP (1)
e.employee_id,
h.employee_ident,
...
FROM
dbo.employee AS e
INNER JOIN dbo.employee_mdata_history AS h
ON e.ident = h.employee_ident
WHERE
e.employee_id LIKE ...
ORDER BY
...
Debe utilizar una condición OR / AND:
SELECT TOP (1)
employee_id, employee_ident, utc_dt, rx_dt
FROM employee
INNER JOIN employee_mdata_history
ON employee.ident = employee_mdata_history.employee_ident
WHERE employee_id like 'emp1%'
OR employee_id like 'emp3%'
ORDER BY rx_dt desc;
Eche un vistazo a OR (Transact-SQL) en MS-Docs.
He creado un ejemplo:
create table employees(employee_id varchar(10), employee_name varchar(100)); insert into employees values ('emp10', 'Bryan Nelson'), ('emp12', 'Rosalyn Sanders'), ('emp13', 'Rose Tudler'), ('emp20', 'Julio Gomez'), ('emp30', 'Ian McGregor'), ('emp40', 'Anne Hatt'); GO
SELECT employee_id, employee_name FROM employees WHERE employee_id LIKE 'emp1%' OR employee_id LIKE 'emp3%'; GO
employee_id | employee_name :---------- | :-------------- emp10 | Bryan Nelson emp12 | Rosalyn Sanders emp13 | Rose Tudler emp30 | Ian McGregor
Tenga en cuenta que está usando TOP 1, obtendrá una fila como máximo, sin importar cuántas condiciones use.
SELECT TOP 1 employee_id, employee_name FROM employees WHERE employee_id LIKE 'emp1%' OR employee_id LIKE 'emp3%'; GO
employee_id | employee_name :---------- | :------------ emp10 | Bryan Nelson
Si necesita las filas TOP (X) WHERE employee_id LIKE 'emp1%'
más filas TOP (X) WHERE employee_id LIKE 'emp3%'
puede utilizar dos sentencias de selección unidas a UNION ALL.
SELECT TOP 3 employee_id, employee_name FROM employees WHERE employee_id LIKE 'emp1%' UNION ALL SELECT TOP 1 employee_id, employee_name FROM employees WHERE employee_id LIKE 'emp3%' GO
employee_id | employee_name :---------- | :-------------- emp10 | Bryan Nelson emp12 | Rosalyn Sanders emp13 | Rose Tudler emp30 | Ian McGregor
Además, agregaré una búsqueda de patrón, pero esta solución devuelve todos los registros que coinciden con el patrón: LIKE ’emp[13]% ‘
SELECT employee_id, employee_name FROM employees WHERE employee_id LIKE 'emp[13]%' GO
employee_id | employee_name :---------- | :-------------- emp10 | Bryan Nelson emp12 | Rosalyn Sanders emp13 | Rose Tudler emp30 | Ian McGregor
dbfiddle aquí
Supongo que quieres 1 fila where employee_id like 'emp1%'
y otro where employee_id like 'emp3%'
. Una forma de lograrlo es utilizar un union
:
SELECT t1.*
FROM
( SELECT top 1 employee_id, employee_ident, utc_dt, rx_dt
FROM employee
JOIN employee_mdata_history
ON employee.ident=employee_mdata_history.employee_ident
WHERE employee_id like 'emp1%'
ORDER BY rx_dt desc
) AS t1
UNION ALL
SELECT t2.*
FROM
( SELECT top 1 employee_id, employee_ident, utc_dt, rx_dt
FROM employee
JOIN employee_mdata_history
ON employee.ident=employee_mdata_history.employee_ident
WHERE employee_id like 'emp3%'
ORDER BY rx_dt desc
) AS t2 ;
Dado que se garantiza que las piernas en la unión estarán separadas un UNION ALL
se puede usar, y eso podría ser una ventaja de rendimiento en comparación con el uso de solo un UNION
.
Creo que SQL-server 2008 admite funciones de ventana como row_number (), por lo que puede usar algo como:
SELECT employee_id, employee_ident, utc_dt, rx_dt
FROM (
SELECT employee_id, employee_ident, utc_dt, rx_dt
, row_number() over (partition by substring(employee_id,1,4)
order by rx_dt desc) as rn
FROM employee
JOIN employee_mdata_history
ON employee.ident = employee_mdata_history.employee_ident
WHERE employee_id like 'emp1%'
OR employee_id like 'emp3%'
) as T
WHERE rn = 1
ORDER BY rx_dt desc;