SQL WITH




SQL > SQL Avanzado > WITH

A veces te enfrentas a una pregunta compleja que no puede ser respondida fácilmente mediante una única declaración SQL.

Podrías intentar llegar a la respuesta en un solo paso mediante el uso de varias vistas en línea o múltiples subconsultas, pero eso probablemente hará que tu SQL sea difícil de entender, y algunas variedades de SQL, como Hive SQL, no permiten más de una subconsulta.

Un segundo enfoque es descomponer la complejidad en varios pasos diferentes. Una forma de hacerlo es crear varias tablas, con cada tabla almacenando los resultados de cada paso. Esta suele ser una buena estrategia, ya que facilita la depuración y hace que sea más sencillo seguir cómo se ejecuta el código.

Sin embargo, el efecto no deseado es que debes recordar eliminar estas tablas una vez que hayas terminado tu análisis; de lo contrario, estas tablas quedarán en la base de datos, lo que crea problemas de gestión de bases de datos.

La alternativa a crear múltiples tablas es utilizar la cláusula WITH en SQL.

Sintaxis

La sintaxis básica para la cláusula WITH es la siguiente:

WITH <nombre_de_consulta_1> COMO (
SELECT Declaración 1
)
Declaración SELECT principal

El uso de la cláusula WITH es muy similar a la creación de tablas. Cuando creas una tabla, le das un nombre. De manera similar, cuando usas la cláusula WITH, también le das un nombre, y este nombre actúa esencialmente como un nombre de tabla en la declaración SQL principal.

Dado que WITH no crea una tabla ni una vista, el objeto asociado con la declaración WITH desaparece después de que se ejecuta la declaración SQL principal, y no hay nada que limpiar.

También puedes tener múltiples cláusulas WITH. La sintaxis es la siguiente:

WITH <nombre_de_consulta_1> AS (
SELECT Declaración 1
), <nombre_de_consulta_2> AS (
SELECT Declaración 2
),
..
<nombre_de_consulta_n> AS (
SELECT Declaración N
)
Declaración SELECT principal

Para tener múltiples cláusulas WITH, no es necesario especificar WITH varias veces. En su lugar, después de que se complete la primera cláusula WITH, agrega una coma y luego puedes especificar la siguiente cláusula comenzando con <nombre_de_consulta> seguido de COMO. No hay coma entre la última cláusula WITH y la declaración SQL principal.

Ejemplos

Utilizamos la siguiente tabla en nuestros ejemplos.

Tabla Store_Sales
 Store_Name  Sales 
 Los Angeles  15000 
 San Diego  2500 
 New York  3000 
 Boston  7000 

Ejemplo 1: Usar WITH en una declaración SELECT

Digamos que queremos listar todas las tiendas que tienen más ventas que el promedio. Para hacerlo, podemos utilizar la siguiente declaración WITH:

WITH t1 AS (
SELECT AVG(Sales) AVG_SALES FROM Store_Sales
)
SELECT a1.* FROM Store_Sales a1, t1
WHERE a1.Sales > t1.AVG_SALES;

Resultado:

Store_Name Sales
Los Angeles 15000
Boston 7000

La declaración WITH calcula el monto promedio de ventas (que es de $6,875), luego la consulta principal de SQL simplemente devuelve todas las filas donde el valor de la columna de Ventas es mayor que este monto promedio.

Un SQL equivalente usando una vista en línea sería:

SELECT a1.* FROM Store_Sales a1,
(SELECT AVG(Sales) AVG_SALES FROM Store_Sales) t1
WHERE a1.Sales > t1.AVG_SALES;

Del mismo modo, esto se puede lograr a través del siguiente SQL utilizando una subconsulta:

SELECT a1.* FROM Store_Sales a1
WHERE a1.Sales >
(SELECT AVG(Sales) AVG_SALES FROM Store_Sales);

Ten en cuenta que la versión con subconsulta no funciona en Hive SQL debido a cómo Hive SQL admite las subconsultas.

Ejemplo 2: Usar WITH en una declaración CREATE TABLE

También podemos utilizar WITH junto con una declaración CREATE TABLE. Digamos que queremos crear una tabla utilizando la cláusula WITH en el ejemplo anterior, escribiríamos lo siguiente:

CREATE TABLE Above_Average_Sales
AS
WITH t1 AS (
SELECT AVG(Sales) AVG_SALES FROM Store_Sales
)
SELECT a1.* FROM Store_Sales a1, t1
WHERE a1.Sales > t1.AVG_SALES;

La parte WITH de la consulta va después de CREATE TABLE AS. No coloques la cláusula WITH al principio. La consulta a continuación generará un error:

WITH t1 AS (
SELECT AVG(Sales) AVG_SALES FROM Store_Sales
)
CREATE TABLE Above_Average_Sales
AS
SELECT a1.* FROM Store_Sales a1, t1
WHERE a1.Sales > t1.AVG_SALES;

SQL EXISTS >>

Esta página se actualizó por última vez el 15/10/2023



Copyright © 2024   1keydata.com   Todos los derechos reservados.