DataSunrise está patrocinando AWS re:Invent 2024 en Las Vegas, por favor visítenos en el stand #2158 de DataSunrise

Snowflake Cross Apply

Snowflake Cross Apply

Snowflake Cross Apply

Introducción

Cuando se usa SQL para consultas complejas, es posible que necesite combinar datos de diferentes tablas de formas más avanzadas. Esto va más allá de simplemente usar uniones internas y externas. El operador CROSS APPLY en SQL Server le permite unir una tabla con una función que devuelve una tabla, creando opciones de consulta versátiles. Sin embargo, si está utilizando la plataforma de datos en la nube de Snowflake, es posible que haya notado que no existe un análogo de CROSS APPLY en Snowflake.

Este artículo explicará cómo funciona CROSS APPLY y cómo usarlo en Snowflake con LATERAL JOIN. También compararemos las diferencias entre estos dos métodos. También compararemos las diferencias entre estos dos enfoques.

Al final, tendrá una comprensión sólida de cómo realizar uniones complejas en Snowflake que son análogas al CROSS APPLY de SQL Server. ¡Vamos a sumergirnos!

¿Qué es CROSS APPLY?

En SQL Server, CROSS APPLY es un operador que le permite unir una tabla con una función que devuelve una tabla. Aplica la función a cada fila de la tabla de la izquierda y produce un conjunto de resultados combinando las filas de la tabla de la izquierda con las filas correspondientes devueltas por la función.

Aquí hay un ejemplo simple para ilustrar cómo funciona:

-- Usando CROSS APPLY
SELECT *
FROM Person p
CROSS APPLY (
SELECT *
FROM Company c
WHERE p.companyid = c.companyId
) Czip;

En este ejemplo, la subconsulta se ejecuta para cada fila en la tabla Persona utilizando el operador. Devuelve las filas coincidentes de la tabla Compañía donde companyId coincide. El resultado es una unión entre Persona y Compañía basada en la relación ‘companyId’.

La consulta equivalente usando la sintaxis INNER JOIN estándar sería:

-- Consulta equivalente usando INNER JOIN
SELECT *
FROM Person p
INNER JOIN Company c ON p.companyid = c.companyId;

Ambas consultas devolverán el mismo conjunto de resultados, pero la versión CROSS APPLY permite condiciones de unión más complejas y puede ser particularmente útil cuando se trabaja con funciones que devuelven tablas.

Snowflake Cross Apply

Snowflake no tiene CROSS APPLY, pero tiene una funcionalidad similar con la palabra clave LATERAL cuando se utiliza con una unión. En el estándar ANSI SQL, una unión lateral permite usar columnas de tablas anteriores en la condición de unión. Esto da como resultado el mismo resultado que usar CROSS APPLY.

Aquí hay un ejemplo de cómo puede usar una unión lateral en Snowflake para lograr el mismo resultado que el ejemplo anterior:

-- Usando LATERAL JOIN en Snowflake
SELECT *
FROM Person p
LEFT JOIN LATERAL (
SELECT *
FROM Company c
WHERE p.companyid = c.companyId
) Czip ON TRUE;

En este ejemplo, la palabra clave LATERAL se usa para indicar que la subconsulta que la sigue puede hacer referencia a columnas de la tabla anterior Persona. La condición ON TRUE une incondicionalmente la subconsulta lateral con la tabla Persona.

La unión lateral se comporta de manera similar a CROSS APPLY, ejecutando la subconsulta para cada fila de la tabla de la izquierda y combinando los resultados. La principal diferencia es que CROSS APPLY realiza una unión interna, mientras que el ejemplo de unión lateral anterior utiliza una unión externa a la izquierda. Puede lograr un comportamiento de unión interna simplemente cambiando LEFT JOIN LATERAL a INNER JOIN LATERAL.

Planes de Ejecución

Veamos más de cerca los planes de ejecución para los ejemplos de CROSS APPLY y unión lateral para entender cómo difieren.

Para el ejemplo de CROSS APPLY en SQL Server:

  1. El sistema escanea la tabla Persona para recuperar todas las filas.
  2. Para cada fila en Persona, SQL Server ejecuta la subconsulta después de CROSS APPLY. Filtra la tabla Compañía en función de la condición companyId.
  3. La consulta une las filas resultantes de la subconsulta con la fila correspondiente de Persona.
  4. La función devuelve el conjunto de resultados final.

Para el ejemplo de LATERAL JOIN en Snowflake:

  1. El sistema escanea la tabla Persona para recuperar todas las filas.
  2. La subconsulta lateral se ejecuta para cada fila en Persona, filtrando la tabla Compañía en función de la condición companyId.
  3. Las filas resultantes de la subconsulta lateral se unen a la izquierda con la fila correspondiente de Persona usando la condición ON TRUE.
  4. La función devuelve el conjunto de resultados final.

Los planes de ejecución para ambos enfoques son similares, con la principal diferencia siendo el tipo de unión utilizada (unión interna para CROSS APPLY y unión externa a la izquierda para el ejemplo de unión lateral).

Ejemplo con Preparación Preliminar

Veamos un ejemplo más completo que incluya algunos pasos de preparación preliminares. Supongamos que tenemos dos tablas: Orders y OrderItems. Cada pedido puede tener múltiples artículos de pedido, y queremos recuperar el monto total de cada pedido junto con los detalles del pedido.

Primero, creemos las tablas necesarias:

-- Crear tabla Orders
CREATE TABLE Orders (
OrderID INT,
CustomerID INT,
OrderDate DATE
);
-- Crear tabla OrderItems
CREATE TABLE OrderItems (
OrderID INT,
ItemID INT,
Quantity INT,
Price DECIMAL(10, 2)
);
-- Insertar datos de muestra en la tabla Orders
INSERT INTO Orders (OrderID, CustomerID, OrderDate)
VALUES
(1, 101, '2023-05-01'),
(2, 102, '2023-05-02'),
(3, 101, '2023-05-03');
-- Insertar datos de muestra en la tabla OrderItems
INSERT INTO OrderItems (OrderID, ItemID, Quantity, Price)
VALUES
(1, 1, 2, 10.00),
(1, 2, 1, 15.00),
(2, 1, 3, 10.00),
(2, 3, 2, 20.00),
(3, 2, 1, 15.00);

Ahora, usemos una unión lateral para recuperar los detalles del pedido junto con el monto total de cada pedido:

SELECT
o.OrderID,
o.CustomerID,
o.OrderDate,
oi.TotalAmount
FROM Orders o
LEFT JOIN LATERAL (
SELECT
OrderID,
SUM(Quantity * Price) AS TotalAmount
FROM OrderItems
WHERE OrderID = o.OrderID
GROUP BY OrderID
) oi ON TRUE;

En este ejemplo, para cada fila en la tabla Orders, la subconsulta lateral se ejecuta para calcular el monto total del pedido sumando el producto de Quantity y Price para los artículos de pedido correspondientes. El resultado luego se une con la tabla Orders usando la condición ON TRUE.

La salida de esta consulta será:

OrderID | CustomerID | OrderDate  | TotalAmount
--------+------------+------------+------------
1       | 101        | 2023-05-01 | 35.00
2       | 102        | 2023-05-02 | 70.00
3       | 101        | 2023-05-03 | 15.00

Resumen y Conclusión

En este artículo, vimos cómo funciona CROSS APPLY en SQL Server y su equivalente en Snowflake usando uniones laterales. Descubrimos que Snowflake no tiene CROSS APPLY, pero las uniones laterales funcionan de manera similar. Permiten que las subconsultas utilicen columnas de tablas anteriores en la condición de unión.

Vimos ejemplos de cómo usar CROSS APPLY en SQL Server y cómo lograr el mismo resultado usando una unión lateral en Snowflake. Hablamos sobre los planes para ambos métodos y dimos un ejemplo detallado con pasos de configuración inicial.

Saber cómo usar uniones laterales en Snowflake es importante para escribir consultas eficientes con múltiples tablas y subconsultas.

Sobre DataSunrise

DataSunrise proporciona herramientas fáciles de usar y flexibles para la seguridad de bases de datos Snowflake, auditoría y cumplimiento. Nuestras soluciones ayudan a las organizaciones a proteger datos sensibles, monitorear la actividad de la base de datos y garantizar el cumplimiento con regulaciones como GDPR, HIPAA y PCI DSS.

Si está interesado en aprender más sobre lo que DataSunrise tiene para ofrecer, lo invitamos a solicitar una demostración en línea. Nuestro equipo de expertos estará encantado de mostrar nuestros productos y discutir cómo pueden ayudarle a asegurar y gestionar sus bases de datos de manera efectiva.

Siguiente

PostgreSQL Encryption

PostgreSQL Encryption

Más información

¿Necesita la ayuda de nuestro equipo de soporte?

Nuestros expertos estarán encantados de responder a sus preguntas.

Información general:
[email protected]
Servicio al Cliente y Soporte Técnico:
support.datasunrise.com
Consultas sobre Asociaciones y Alianzas:
[email protected]