• 2.5.2017
  • Ing. Jan Zedníček - Data Engineer & Controlling
  • 0

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

SQL EXISTS

  • 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

Rate this post

Ing. Jan Zedníček - Data Engineer & Controlling

Jmenuji se Honza Zedníček a působím jako freelancer. Pracoval jsem dříve také jako BI developer, finanční controller a analytik. Vše pro společnosti z oblasti IT, bankovnictví, consultingu a výroby. Po práci si rád zahraju tenis, volejbal, šachy, zajdu do posilovny a občas neúspěšně odpálím pár balónků v golfu 🏌️

Již cca 10 let zapisuji na tento web různé návody určené zejména odborné veřejnosti, studentům a zájemcům o informace z oblastí Business intelligence, korporátních financí a reportingu.

🔥 Přihlašte se do naší Excel facebook skupiny (2.4k+ členů), kde si pomáháme Excel CZ/SK diskuse »

Leave a Reply

Your email address will not be published. Required fields are marked *