Pregunta

Dadas las siguientes definiciones:

CREATE TABLE MyTable
(
    col1 int,
    col2 int,
    col3 int,
    col4 int
)

CREATE FUNCTION fn_MyFunction
(
    @Param1 int,
    @Param2 int
)
RETURNS TABLE AS RETURN
(
    SELECT @Param1 * 2 AS 'res1', @Param2 * 4 AS 'res2', @Param1 AS 'col3'
)

Estoy tratando de unir la función a la tabla para obtener un valor calculado (s) por fila. Ejemplo: en una tabla de reservas, necesito obtener el precio basado en una fecha de inicio y una fecha de finalización.

Aquí hay una consulta de ejemplo:

SELECT      tbl.col1
,           tbl.col2
,           tbl.col3
,           fn.res1
,           fn.res1
FROM        MyTable tbl
CROSS APPLY fn_MyFunction(tbl.col3, tbl.col4) fn
WHERE       fn.col3 = tbl.col3

Si bien creo que estoy obteniendo los resultados correctos en mi consulta real, ¿cómo es el CROSS APPLY obtener los resultados en este caso? ¿Los obtiene fila por fila (efectivamente)? O funciona de manera similar a CROSS JOIN (es decir,: hacer un producto cartesiano)?

¿Fue útil?

Solución

CROSS APPLY Toma una función valorada de tabla y 'aplica' parámetros de cada fila en la consulta a la que la está aplicando. La función se evalúa una vez para cada fila y la salida se une implícitamente a la fila de origen en el conjunto de registros desde el cual se obtuvieron los parámetros. Tenga en cuenta que esta 'unirse' puede ser 1: M - con una fila TVF en la fuente puede generar múltiples filas de salida del TVF.

No necesita usar más predicados en la cláusula WHERE para unir los resultados a menos que (por alguna razón) desee filtrar aún más la salida de la función aplicando un predicado adicional.

CROSS APPLY es bastante útil con las consultas XPath si tiene que ver a los campos XML que pueden contener grupos repetidos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top