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.