SQL EXISTS operátor – Test existence

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

1 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

2 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í operátoru sql EXISTS všechny produkty, které patří do kategorie „helmy“. Pokud taková kategorie neexistuje bude výsledkem prázdná tabulka.

Řešení 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')

SQL EXISTS

  • Omezení hlavního dotazu na kategorii „Helmy“ je provedeno ve WHERE části 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

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

Reagovat na příspěvek