Buscar..


Conceptos básicos sobre la aplicación y la aplicación externa

Aplicar se utilizará cuando la función con valor de tabla en la expresión correcta.

crear una tabla de departamento para contener información sobre los departamentos. Luego cree una tabla de empleados que contenga información sobre los empleados. Tenga en cuenta que cada empleado pertenece a un departamento, por lo que la tabla de Empleados tiene integridad referencial con la tabla de Departamentos.

La primera consulta selecciona los datos de la tabla del Departamento y usa CROSS APPLY para evaluar la tabla de Empleados para cada registro de la tabla del Departamento. La segunda consulta simplemente une la tabla de Departamento con la tabla de Empleado y se producen todos los registros coincidentes.

SELECT *
FROM Department D
CROSS APPLY (
    SELECT *
    FROM Employee E
    WHERE E.DepartmentID = D.DepartmentID
) A
GO
SELECT *
FROM Department D
INNER JOIN Employee E
  ON D.DepartmentID = E.DepartmentID

Si nos fijamos en los resultados que producen, es exactamente el mismo conjunto de resultados; ¿En qué se diferencia de un JOIN y cómo ayuda a escribir consultas más eficientes?

La primera consulta en el Script # 2 selecciona los datos de la tabla del Departamento y usa APLICACIÓN EXTERNA para evaluar la tabla de Empleados para cada registro de la tabla del Departamento. Para aquellas filas para las que no hay una coincidencia en la tabla Empleado, esas filas contienen valores NULOS como puede ver en el caso de las filas 5 y 6. La segunda consulta simplemente utiliza una JUNTA EXTERNA IZQUIERDA entre la tabla Departamento y la tabla Empleado. Como era de esperar, la consulta devuelve todas las filas de la tabla de Departamento; incluso para aquellas filas para las que no hay coincidencia en la tabla Empleado.

SELECT *
FROM Department D
OUTER APPLY (
    SELECT *
    FROM Employee E
    WHERE E.DepartmentID = D.DepartmentID
) A
GO
SELECT *
FROM Department D
LEFT OUTER JOIN Employee E
  ON D.DepartmentID = E.DepartmentID
GO

Aunque las dos consultas anteriores devuelven la misma información, el plan de ejecución será un poco diferente. Pero en cuanto al costo no habrá mucha diferencia.

Ahora llega el momento de ver dónde se requiere realmente el operador APLICAR. En el script # 3, estoy creando una función con valores de tabla que acepta el ID de departamento como parámetro y devuelve a todos los empleados que pertenecen a este departamento. La siguiente consulta selecciona datos de la tabla del Departamento y utiliza CROSS APPLY para unirse a la función que creamos. Pasa el ID de departamento para cada fila de la expresión de la tabla externa (en nuestra tabla de Departamento de casos) y evalúa la función para cada fila similar a una subconsulta correlacionada. La siguiente consulta utiliza la APLICACIÓN EXTERNA en lugar de la APLICACIÓN CRUZADA y, por lo tanto, a diferencia de la APLICACIÓN CRUZADA que solo devolvió datos correlacionados, la APLICACIÓN EXTERNA también devuelve datos no correlacionados, colocando NULL en las columnas que faltan.

CREATE FUNCTION dbo.fn_GetAllEmployeeOfADepartment (@DeptID AS int)
RETURNS TABLE
AS
  RETURN
  (
  SELECT
    *
  FROM Employee E
  WHERE E.DepartmentID = @DeptID
  )
GO
SELECT
  *
FROM Department D
CROSS APPLY dbo.fn_GetAllEmployeeOfADepartment(D.DepartmentID)
GO
SELECT
  *
FROM Department D
OUTER APPLY dbo.fn_GetAllEmployeeOfADepartment(D.DepartmentID)
GO

Así que ahora, si se está preguntando, ¿podemos utilizar una combinación simple en lugar de las consultas anteriores? Entonces la respuesta es NO, si reemplaza CROSS / OUTER APPLY en las consultas anteriores con INNER JOIN / LEFT OUTER JOIN, especifique la cláusula ON (algo como 1 = 1) y ejecute la consulta, obtendrá "El identificador de varias partes" D.DepartmentID "no se pudo enlazar". error. Esto se debe a que, con JOINs, el contexto de ejecución de la consulta externa es diferente del contexto de ejecución de la función (o una tabla derivada), y no puede vincular un valor / variable de la consulta externa a la función como un parámetro. Por lo tanto, se requiere el operador APLICAR para tales consultas.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow