He estado mirando CROSS / OUTER APPLYcon 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 JOINcon RANK()y OUTER APPLYtodos 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
APPLYson ...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
VALUESsintaxis 2008+ .En 2005
UNION ALLse puede utilizar en su lugar.fuente
Hay varias situaciones en las que no puedes evitar
CROSS APPLYoOUTER APPLY.Considera que tienes dos mesas.
MESA PRINCIPAL
TABLA DE DETALLES
Hay muchas situaciones donde tenemos que reemplazar
INNER JOINconCROSS APPLY.1. Si queremos unir 2 tablas de
TOP nresultados conINNER JOINfuncionalidadConsidere si necesitamos seleccionar
IdyNamedesdeMastery las dos últimas fechas para cada unoIddeDetails table.La consulta anterior genera el siguiente resultado.
Vea, generó resultados para las últimas dos fechas con las últimas dos fechas
Idy 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 APPLYpuede hacer referencia a la tabla externa, dondeINNER JOINno 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 JOINfuncionalidad usando funciones.CROSS APPLYpuede usarse como un reemplazoINNER JOINcuando necesitamos obtener resultados de laMastertabla y afunction.Y aquí está la función.
que generó el siguiente resultado
1. Si queremos unir 2 tablas de
TOP nresultados conLEFT JOINfuncionalidadConsidere si necesitamos seleccionar Id y Nombre de
Mastery las dos últimas fechas para cada Id de laDetailstabla.que forma el siguiente resultado
Esto traerá resultados incorrectos, es decir, traerá solo los últimos datos de dos fechas de la
Detailstabla, independientemente deIdsi nos unimosId. Entonces, la solución adecuada es usarOUTER APPLY.que forma el siguiente resultado deseado
2. Cuando necesitamos
LEFT JOINfuncionalidad usandofunctions.OUTER APPLYpuede usarse como un reemplazoLEFT JOINcuando necesitamos obtener resultados de laMastertabla y afunction.Y la función va aquí.
que generó el siguiente resultado
CROSS APPLYoOUTER APPLYse puede usar para retenerNULLvalores al desconectar, que son intercambiables.Considera que tienes la tabla de abajo
Cuando usa
UNPIVOTpara llevarFROMDATEANDTODATEa una columna, eliminará losNULLvalores por defecto.que genera el siguiente resultado. Tenga en cuenta que hemos perdido el registro de
Idnúmero3En tales casos, un
CROSS APPLYoOUTER APPLYserá útilque forma el siguiente resultado y retiene
Iddonde está su valor3fuente
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