En SQL Server, hay dos operadores que se pueden utilizar para unir dos expresiones de tabla: JOIN y APPLY. Si bien pueden producir resultados similares, hay diferencias clave entre ellos. En este artículo, exploraremos el operador APPLY y lo compararemos con los JOIN regulares. También discutiremos cuándo usar cada operador y proporcionaremos algunos casos de uso.
CROSS APPLY vs INNER JOIN
El operador CROSS APPLY se utiliza cuando no hay una condición de unión fácil y la tabla derecha es una expresión o una función con valores de tabla. Es similar a un INNER JOIN, ya que requiere que existan filas en ambas tablas para que se devuelvan los resultados. Por otro lado, si se pueden lograr los mismos resultados con un INNER JOIN, se recomienda utilizar el INNER JOIN en lugar de CROSS APPLY.
Aquí hay un ejemplo de uso de CROSS APPLY:
SELECT L.Name,
R.Name
FROM LeftTable L
CROSS APPLY
(SELECT Name FROM RightTable R WHERE R.ReferenceId = L.Id) R;
Y aquí hay un ejemplo de uso de INNER JOIN:
SELECT L.Name,
R.Name
FROM LeftTable L
INNER JOIN RightTable R
ON R.ReferenceId = L.Id;
OUTER APPLY vs LEFT OUTER JOIN
El operador OUTER APPLY se utiliza cuando no hay una condición de unión fácil y la tabla derecha es una expresión o una función con valores de tabla. Es similar a un LEFT OUTER JOIN, ya que devuelve todas las filas de la expresión de tabla izquierda, incluso si no hay coincidencias en la expresión de tabla derecha. Si se pueden lograr los mismos resultados con un LEFT OUTER JOIN, se recomienda utilizar el LEFT OUTER JOIN en lugar de OUTER APPLY.
Aquí hay un ejemplo de uso de OUTER APPLY:
SELECT L.Name,
R.Name
FROM LeftTable L
OUTER APPLY
(SELECT Name FROM RightTable R WHERE R.ReferenceId = L.Id) R;
Y aquí hay un ejemplo de uso de LEFT OUTER JOIN:
SELECT L.Name,
R.Name
FROM LeftTable L
LEFT OUTER JOIN RightTable R
ON R.ReferenceId = L.Id;
Uso de APPLY con funciones con valores de tabla y tablas
El operador APPLY es particularmente útil cuando se unen funciones con valores de tabla con tablas. Le permite pasar valores de la consulta externa a la función como parámetros. Aquí hay un ejemplo:
SELECT D.Name AS DepartmentName,
E.EmployeeName,
E.YearlySalary
FROM Department D
CROSS APPLY dbo.GetTopEmployeeSalary(D.DepartmentID) E;
En este ejemplo, la función GetTopEmployeeSalary devuelve los dos empleados principales según el salario para cada departamento. El operador APPLY nos permite evaluar la función para cada fila en la tabla Department.
Uso de APPLY con funciones del sistema con valores de tabla y tablas
El operador APPLY también se puede utilizar con funciones del sistema con valores de tabla, como las funciones de administración dinámica (DMFs). Estas funciones proporcionan información sobre la instancia de SQL Server. Aquí hay un ejemplo:
SELECT DB_NAME(r.database_id) AS [Database],
st.[text] AS [Query]
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.plan_handle) st
WHERE r.session_id > 50
AND r.session_id NOT IN (@@SPID);
En este ejemplo, estamos utilizando el operador CROSS APPLY para unir la vista de administración dinámica sys.dm_exec_requests con la función del sistema sys.dm_exec_sql_text. Esto nos permite recuperar las consultas de usuario en ejecución, excluyendo la sesión actual.
En general, el operador APPLY proporciona una herramienta poderosa para unir expresiones de tabla en SQL Server. Es particularmente útil cuando se trabaja con funciones con valores de tabla y funciones del sistema. Al comprender las diferencias entre JOIN y APPLY, puede elegir el operador adecuado para su escenario específico.
Gracias por leer este artículo. Si tiene alguna pregunta o comentario, no dude en dejarlos a continuación.
Última actualización del artículo: 2023-12-07