602SQL-Úplná dokumentace Index  

Zobecněná tabulka (SQL)

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