EXISTS je T-SQL operátor, pomocí kterého lze otestovat existenci výsledku ve vnořeném dotazu (subquery) a na základě toho provést dotaz nebo nějakou úlohu. Sql EXISTS provádí tzv. “Existence test”.
Syntaxe SQL EXISTS
SQL Dotaz:
SELECT Sloupce
FROM dbo.Tabulka
WHERE EXISTS
(SELECT Sloupce
FROM Dbo.Tabulka2
WHERE Podminka);
Pozor operátor provádí pouze test existence. Pokud záznamy v subquery existují, tak se provede hlavní dotaz bez omezení, výsledkem hlavního datazu budou všechny záznamy z tabulky. To se dá ošetřit úpravou syntaxe, viz. příklady
SQL Procedura/Routine
IF EXISTS (SELECT 1 FROM dbo.Tabulka)
PRINT 'Záznam existuje'
Pokud je výsledkem subquery nějaký záznam, provede se hlavní dotaz nebo sekvence kroků
Příklad SQL EXISTS
Jak bylo zmíněno, sql EXISTS neprovádí omezení, ale pouze test existence. Pokud bychom chtěli otestovat, jestli existuje nenulový počet záznamů v subquery na základě podmínky a současně bychom chtěli aplikovat tuto podmínku také na hlavní dotaz, měli bychom k tomu přistoupit takto:
Definice situace – mějme 2 tabulky v databázi obchodu se sportovním vybavením:
- Tabulka dbo.DimProduct – zde se nachází seznam produktů (celkem 606), které prodává naše firma. Každý produkt patří do nějaké produktové kategorie
- Tabulka dbo.DimProductSubcategory – najdeme zde seznam kategorií produktů (celkem 37 kategorií)
Úkolem je najít pomocí sql operátoru všechny produkty, které patří do kategorie “helmy”. Pokud taková kategorie neexistuje bude výsledkem prázdná tabulka.
Řešení sql příkladu
SELECT EnglishProductName AS NazevProduktu, [ListPrice] AS Cena_USD
FROM dbo.DimProduct
WHERE EXISTS
(SELECT 1
FROM dbo.DimProductSubcategory
WHERE ProductSubcategoryKey = dbo.DimProduct.ProductSubcategoryKey
AND EnglishProductSubcategoryName = 'helmets')
- Omezení hlavního dotazu na kategorii “Helmy” je provedeno ve WHERE klauzuli propojením obou tabulek. Tímto nám prakticky vzniká INNER JOIN a dojde k aplikaci omezení i na hlavní query.
- “SELECT 1” je použito z výkonostních důvodů
- Stejného efektu bychom docílili i použitím SQL operátoru IN
Chyba v syntaxi EXISTS
Bylo by chybou napsat dotaz pomocí SQL EXISTS takto
SELECT EnglishProductName AS NazevProduktu, [ListPrice] AS Cena_USD
FROM dbo.DimProduct
WHERE EXISTS
(SELECT 1
FROM dbo.DimProductSubcategory
WHERE
EnglishProductSubcategoryName = 'helmets')
Výsledkem by byly všechny záznamy z tabulky dbo.DimProduct