Sdílet prostřednictvím


Vytváření dotazů pomocí něčeho jiného než tabulky (Nástroje vizuální databáze)

platí pro:SQL Server

Pokaždé, když napíšete dotaz na načtení, vyjadřujete, jaké sloupce chcete, jaké řádky chcete, a kde by procesor dotazů měl najít původní data. Tato původní data se obvykle skládají z tabulky nebo několika tabulek spojených dohromady. Původní data ale můžou pocházet z jiných zdrojů než tabulek. Ve skutečnosti může pocházet ze zobrazení, dotazů, synonym nebo uživatelem definovaných funkcí, které vracejí tabulku.

Použití zobrazení místo tabulky

Řádky můžete vybrat ze zobrazení. Předpokládejme například, že databáze obsahuje zobrazení s názvem "ExpensiveBooks", ve kterém každý řádek popisuje název, jehož cena přesahuje 19,99. Definice zobrazení může vypadat takto:

SELECT *  
FROM titles  
WHERE price > 19.99  

Můžete vybrat drahé knihy z kategorie psychologie tím, že vyberete knihy z kategorie psychologie ze zobrazení drahých knih. Výsledný SQL může vypadat takto:

SELECT *  
FROM ExpensiveBooks  
WHERE type = 'psychology'  

Podobně se může zobrazení účastnit operace JOIN. Například můžete najít prodej drahých knih pouhým připojením tabulky prodeje k zobrazení Drahé knihy. Výsledný SQL může vypadat takto:

SELECT *  
FROM sales   
         INNER JOIN   
         ExpensiveBooks   
         ON sales.title_id   
         =  ExpensiveBooks.title_id  

Další informace o přidání zobrazení do dotazu naleznete v tématu Přidání tabulek do dotazů (Visual Database Tools).

Použití dotazu místo tabulky

Můžete vybrat řádky z výsledku dotazu. Předpokládejme například, že jste už napsali dotaz, který načítá názvy a identifikátory spoluvytvářených knih – knih s více než jedním autorem. SQL může vypadat takto:

SELECT   
     titles.title_id, title, type  
FROM   
     titleauthor   
         INNER JOIN  
         titles   
         ON titleauthor.title_id   
         =  titles.title_id   
GROUP BY   
     titles.title_id, title, type  
HAVING COUNT(*) > 1  

Pak můžete napsat další dotaz, který vychází z tohoto výsledku. Můžete například napsat dotaz, který načte spoluautorské knihy o psychologii. Pokud chcete tento nový dotaz napsat, můžete použít existující dotaz jako zdroj dat nového dotazu. Výsledný SQL může vypadat takto:

SELECT   
    title  
FROM   
    (  
    SELECT   
        titles.title_id,   
        title,   
        type  
    FROM   
        titleauthor   
            INNER JOIN  
            titles   
            ON titleauthor.title_id   
            =  titles.title_id   
    GROUP BY   
        titles.title_id,   
        title,   
        type  
    HAVING COUNT(*) > 1  
    )   
    co_authored_books  
WHERE     type = 'psychology'  

Zvýrazněný text zobrazuje existující dotaz použitý jako zdroj dat nového dotazu. Všimněte si, že nový dotaz používá alias ("co_authored_books") pro existující dotaz. Další informace o aliasech najdete v tématu Vytváření aliasů tabulky (Visual Database Tools) a vytváření aliasů sloupců (Visual Database Tools).

Podobně se dotaz může účastnit operace JOIN. Například můžete najít prodeje drahých spoluautorských knih pouhým připojením zobrazení ExpensiveBooks k dotazu, který získává tyto knihy. Výsledný SQL může vypadat takto:

SELECT   
    ExpensiveBooks.title  
FROM   
    ExpensiveBooks   
        INNER JOIN  
        (  
        SELECT   
            titles.title_id,   
            title,   
            type  
        FROM   
            titleauthor   
                INNER JOIN  
                titles   
                ON titleauthor.title_id   
                =  titles.title_id   
        GROUP BY   
            titles.title_id,   
            title,   
            type  
        HAVING COUNT(*) > 1  
        )  

Další informace o přidání dotazu do dotazu naleznete v tématu Přidání tabulek do dotazů (Visual Database Tools).

Použití funkce User-Defined místo tabulky

V SYSTÉMU SQL Server 2000 nebo vyšší můžete vytvořit uživatelem definovanou funkci, která vrací tabulku. Tyto funkce jsou užitečné pro provádění komplexní nebo procedurální logiky.

Předpokládejme například, že tabulka zaměstnanců obsahuje další sloupec, employee.manager_emp_id, a že existuje cizí klíč z manager_emp_id do employee.emp_id. V každém řádku tabulky zaměstnanců je ve sloupci manager_emp_id uveden nadřízený zaměstnance. Přesněji řečeno, označuje emp_id nadřízeného zaměstnance. Můžete vytvořit uživatelem definovanou funkci, která vrátí tabulku obsahující jeden řádek pro každého zaměstnance pracujícího v organizační hierarchii konkrétního manažera vysoké úrovně. Funkci fn_GetWholeTeam můžete volat a navrhnout ji tak, aby přijímala vstupní proměnnou – emp_id manažera, jehož tým chcete načíst.

Můžete napsat dotaz, který používá funkci fn_GetWholeTeam jako zdroj dat. Výsledný SQL může vypadat takto:

SELECT *   
FROM   
     fn_GetWholeTeam ('VPA30890F')  

"VPA30890F" je emp_id manažera, jehož organizaci chcete načíst. Další informace o přidání uživatelem definované funkce do dotazu naleznete v tématu Přidání tabulek do dotazů (Visual Database Tools). Úplný popis uživatelem definovaných funkcí najdete v tématu User-Defined Functions.