He estado mirando CROSS / OUTER APPLY
con un colega y estamos luchando por encontrar ejemplos de la vida real sobre dónde usarlos.
He pasado mucho tiempo mirando ¿ Cuándo debo usar la Aplicación cruzada sobre la Unión interna? y buscar en Google, pero el ejemplo principal (solo) parece bastante extraño (usar el recuento de filas de una tabla para determinar cuántas filas seleccionar de otra tabla).
Pensé que este escenario podría beneficiarse de OUTER APPLY
:
Tabla de contactos (contiene 1 registro para cada contacto) Tabla de entradas de comunicación (puede contener n teléfono, fax, correo electrónico para cada contacto)
Pero el uso de subconsultas, expresiones de tabla comunes, OUTER JOIN
con RANK()
y OUTER APPLY
todos parecen funcionar por igual. Supongo que esto significa que el escenario no es aplicable APPLY
.
¡Comparta algunos ejemplos de la vida real y ayude a explicar la característica!
fuente
Respuestas:
Algunos usos para
APPLY
son ...1) N principales consultas por grupo (puede ser más eficiente para algunas cardinalidades)
2) Llamar a una función de valor de tabla para cada fila en la consulta externa
3) Reutilizando un alias de columna
4) Desactivar más de un grupo de columnas
Asume que 1NF viola la estructura de la tabla ...
Ejemplo usando la
VALUES
sintaxis 2008+ .En 2005
UNION ALL
se puede utilizar en su lugar.fuente
Hay varias situaciones en las que no puedes evitar
CROSS APPLY
oOUTER APPLY
.Considera que tienes dos mesas.
MESA PRINCIPAL
TABLA DE DETALLES
Hay muchas situaciones donde tenemos que reemplazar
INNER JOIN
conCROSS APPLY
.1. Si queremos unir 2 tablas de
TOP n
resultados conINNER JOIN
funcionalidadConsidere si necesitamos seleccionar
Id
yName
desdeMaster
y las dos últimas fechas para cada unoId
deDetails table
.La consulta anterior genera el siguiente resultado.
Vea, generó resultados para las últimas dos fechas con las últimas dos fechas
Id
y luego unió estos registros solo en la consulta externaId
, lo cual es incorrecto. Para lograr esto, necesitamos usarCROSS APPLY
.y forma el siguiente resultado.
Aquí está el trabajo. La consulta dentro
CROSS APPLY
puede hacer referencia a la tabla externa, dondeINNER JOIN
no puede hacer esto (arroja un error de compilación). Cuando la búsqueda de las dos últimas fechas, uniéndose a que se hace en el interiorCROSS APPLY
, es decir,WHERE M.ID=D.ID
.2. Cuando necesitamos
INNER JOIN
funcionalidad usando funciones.CROSS APPLY
puede usarse como un reemplazoINNER JOIN
cuando necesitamos obtener resultados de laMaster
tabla y afunction
.Y aquí está la función.
que generó el siguiente resultado
1. Si queremos unir 2 tablas de
TOP n
resultados conLEFT JOIN
funcionalidadConsidere si necesitamos seleccionar Id y Nombre de
Master
y las dos últimas fechas para cada Id de laDetails
tabla.que forma el siguiente resultado
Esto traerá resultados incorrectos, es decir, traerá solo los últimos datos de dos fechas de la
Details
tabla, independientemente deId
si nos unimosId
. Entonces, la solución adecuada es usarOUTER APPLY
.que forma el siguiente resultado deseado
2. Cuando necesitamos
LEFT JOIN
funcionalidad usandofunctions
.OUTER APPLY
puede usarse como un reemplazoLEFT JOIN
cuando necesitamos obtener resultados de laMaster
tabla y afunction
.Y la función va aquí.
que generó el siguiente resultado
CROSS APPLY
oOUTER APPLY
se puede usar para retenerNULL
valores al desconectar, que son intercambiables.Considera que tienes la tabla de abajo
Cuando usa
UNPIVOT
para llevarFROMDATE
ANDTODATE
a una columna, eliminará losNULL
valores por defecto.que genera el siguiente resultado. Tenga en cuenta que hemos perdido el registro de
Id
número3
En tales casos, un
CROSS APPLY
oOUTER APPLY
será útilque forma el siguiente resultado y retiene
Id
donde está su valor3
fuente
Un ejemplo de la vida real sería si tuviera un programador y quisiera ver cuál fue la entrada de registro más reciente para cada tarea programada.
fuente
Para responder al punto anterior, haga un ejemplo:
Y ahora ejecute las dos consultas con un plan de ejecución.
Puede ver que la consulta de aplicación externa es más eficiente. (No se pudo adjuntar el plan ya que soy un nuevo usuario ... Doh.)
fuente