SQL WITH





SQL > Geavanceerde SQL > WITH

Soms wordt u geconfronteerd met een complexe vraag die niet gemakkelijk kan worden beantwoord met slechts één SQL-instructie.

U zou kunnen proberen om het antwoord in één keer te vinden door meerdere inline weergaven of meerdere subquery's te gebruiken, maar dat zal waarschijnlijk uw SQL moeilijk te begrijpen maken, en sommige SQL-varianten, zoals Hive SQL, staan niet meer dan één subquery toe.

Een tweede aanpak is om de complexiteit op te splitsen in verschillende stappen. Een manier om dit te doen is door meerdere tabellen te maken, waarbij elke tabel de resultaten van elke stap opslaat. Dit is vaak een goede strategie, omdat dit het debuggen vergemakkelijkt en het volgen van de uitvoering van de code eenvoudiger wordt.

Het ongewenste neveneffect is echter dat u moet onthouden om deze tabellen te verwijderen nadat u klaar bent met uw analyse; anders blijven deze tabellen in de database achter, wat databasebeheerproblemen veroorzaakt.

De alternatieve methode om meerdere tabellen te maken, is het gebruik van de WITH-clausule in SQL.

Syntaxis

De basis syntaxis voor de WITH-clausule is als volgt:

WITH <query_naam_1> AS (
SELECT Verklaring 1
)
Hoofd SELECT Verklaring

Het gebruik van de WITH-clausule lijkt sterk op het maken van tabellen. Wanneer u een tabel maakt, geeft u deze een naam. Op dezelfde manier, wanneer u de WITH-clausule gebruikt, geeft u deze ook een naam, en deze naam fungeert in feite als een tabelnaam in de hoofd-SQL-verklaring.

Omdat WITH geen tabel of weergave creëert, verdwijnt het object dat is geassocieerd met de WITH-verklaring nadat de hoofd-SQL-verklaring is uitgevoerd, en er is niets op te ruimen.

U kunt ook meerdere WITH-clausules hebben. De syntaxis is als volgt:

WITH <query_naam_1> AS (
SELECT Verklaring 1
), <query_naam_2> AS (
SELECT Verklaring 2
),
..
<query_naam_n> AS (
SELECT Verklaring N
)
Hoofd SELECT Verklaring

Om meerdere WITH-clausules te hebben, hoeft u niet meerdere keren WITH te specificeren. In plaats daarvan, nadat de eerste WITH-clausule is voltooid, voegt u een komma toe, en dan kunt u de volgende clausule specificeren door te beginnen met <query_naam> gevolgd door ALS. Er is geen komma tussen de laatste WITH-clausule en de hoofd-SQL-query.

Voorbeelden

We gebruiken de volgende tabel in onze voorbeelden.

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

Voorbeeld 1: Gebruik With in een SELECT-verklaring

Laten we zeggen dat we alle winkels willen opsommen die meer verkopen hebben dan het gemiddelde. Hiervoor kunnen we de volgende WITH-verklaring gebruiken:

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

Resultaat:

Store_Name Sales
Los Angeles 15000
Boston 7000

De WITH-verklaring berekent het gemiddelde verkoopbedrag (dat $6.875 is), en de hoofd-SQL-query retourneert eenvoudig alle rijen waar de waarde van de kolom Verkoop groter is dan dit gemiddelde bedrag.

Een equivalent SQL met behulp van een inline weergave zou zijn:

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

Op dezelfde manier kan dit worden bereikt via de volgende SQL met behulp van een subquery:

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

Merk op dat de subquery-versie niet werkt in Hive SQL vanwege hoe Hive SQL subqueries ondersteunt.

Voorbeeld 2: Gebruik WITH in een CREATE TABLE-verklaring

We kunnen ook WITH samen met een CREATE TABLE-verklaring gebruiken. Laten we zeggen dat we een tabel willen maken met behulp van de WITH-clausule in het vorige voorbeeld, dan zouden we het volgende invoeren:

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;

Het WITH-gedeelte van de query komt na CREATE TABLE AS. Plaats de WITH-clausule niet aan het begin. De onderstaande query zal een foutmelding geven:

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 >>

Deze pagina is voor het laatst bijgewerkt op 15-10-2023



Copyright © 2024   1keydata.com   Alle rechten voorbehouden