|
![]() | Dotazy | Specifikace dotazu | ![]() |
zobecněná tabulka ::= { identifikátor_tabulky [ specifikace_indexu ]
| identifikátor_uloženého_dotazu | systémový_dotaz | ( dotazový_výraz ) | join }
[ přejmenování ]
specifikace_indexu ::= INDEX jméno_indexu
join ::= zobecněná_tabulka druh_joinu zobecněná_tabulka [ specifikace_joinu ]
druh_joinu ::= CROSS JOIN | [ NATURAL ] [ INNER | { LEFT | RIGHT | FULL } [ OUTER ] ] JOIN
specifikace_joinu ::= ON podmínka | USING ( název_sloupce { , název_sloupce }…)
přejmenování ::= [ AS ] jméno [( jméno_sloupce { , jméno_sloupce }…)]
Pojem zobecněná tabulka definuje, které objekty mohou v jazyce SQL plnit funkci tabulky. Kromě skutečné tabulky nebo dotazu uloženého v databázi (v SQL terminologii VIEW) a systémových dotazů to může být i dotazový výraz v závorkách (tj. subdotaz) nebo join.
Pojem join vyjadřuje vytvoření spojených záznamů ze dvou tabulek zřetězením hodnot sloupců z jednoho záznamu první tabulky a jednoho záznamu druhé tabulky. Druh joinu a specifikace joinu určují, který záznam s kterým se takto spojí:
Specifikace indexu u jména tabulky vnutí použití konkrétního indexu bez ohledu na volbu optimalizátoru.
Případné přejmenování na konci zobecněné tabulky dovoluje zadat jméno, jimž se bude možno na tuto tabulku dále odkazovat, a případně také jména sloupců této tabulky. Počet uvedených jmen sloupců musí být stejný jako počet sloupců v zobecněné tabulce.
Odchylky od Intermediate level směrem k Full level nebo k SQL 3
Rozšíření jazyka SQL proti normě
Příklad použití dotazových výrazů a joinů na místě zobecněné tabulky (z aplikace eSupport - zjednodušeno):
SELECT *
FROM Kb_topics
LEFT OUTER JOIN
(SELECT topic_id,un_reports+un_answers AS unanswered
FROM (SELECT topic_id,Count(*) AS un_reports
FROM Kb_reports WHERE all_answer_count=0 GROUP BY topic_id
)
JOIN
(SELECT Kb_reports.topic_id,Count(*) AS un_answers
FROM Kb_reports JOIN Kb_answers ON (Kb_reports.id=Kb_answers.report_id)
WHERE (NOT EXISTS(SELECT *
FROM Kb_answers answ
WHERE Kb_answers.id=answ.question_id))
GROUP BY Kb_reports.topic_id
)
USING (topic_id))
ON (Kb_topics.id=topic_id)
ORDER BY Kb_topics.pos
Viz
![]() | Dotazy | Specifikace dotazu | ![]() |