The Bežné tabuľkové výrazy (CTE) boli zavedené do štandardného SQL s cieľom zjednodušiť rôzne triedy SQL dotazov, pre ktoré bola odvodená tabuľka práve nevhodná. CTE bol zavedený v SQL Server 2005, spoločný tabuľkový výraz (CTE) je dočasná pomenovaná množina výsledkov, na ktorú môžete odkazovať v rámci VYBRAŤ , VLOŽIŤ , AKTUALIZOVAŤ , alebo VYMAZAŤ vyhlásenie. CTE môžete použiť aj v zobrazení CREATE ako súčasť dotazu SELECT zobrazenia. Okrem toho, od SQL Server 2008, môžete pridať CTE do nového príkazu MERGE.
Prečo potrebujeme CTE na serveri SQL?
Bežná tabuľka [zastarané]CTE je výkonná SQL konštrukcia, ktorá pomáha zjednodušiť dotazy. CTE fungujú ako virtuálne tabuľky (so záznamami a stĺpcami), ktoré sú vytvorené počas vykonávania dotazu, používané dotazom a vymazané po vykonaní dotazu.
Pomocou CTE
CTE môžeme definovať pridaním klauzuly WITH priamo pred príkaz SELECT, INSERT, UPDATE, DELETE alebo MERGE. Klauzula WITH môže obsahovať jeden alebo viacero CTE oddelených čiarkami.
aký veľký je tento monitor
Syntax:
[S [, …]]
::=
cte_name [(názov_stĺpca [, …])]
AS (cte_query)
java rozdeliť reťazec podľa oddeľovača
Argumentovať
- Názov výrazu: Platný identifikátor pre bežný tabuľkový výraz. Výraz_názov sa musí líšiť od názvov iných bežných tabuľkových výrazov definovaných v rovnakej klauzule WITH, ale názov_výrazu môže byť rovnaký ako názov základnej tabuľky alebo zobrazenia. Všetky odkazy na výraz_názov v dotaze používajú spoločný tabuľkový výraz namiesto základného objektu.
- Názov stĺpca: Určuje názov stĺpca v bežnom tabuľkovom výraze. Duplicitné názvy v rámci jednej definície CTE nie sú povolené. Počet názvov stĺpcov sa musí zhodovať s počtom stĺpcov v sade výsledkov CTE_query_definition. Zoznam názvov stĺpcov je voliteľný iba vtedy, ak majú všetky výsledné stĺpce v definícii dotazu rôzne názvy.
- CTE_QueryDefinition: Určuje príkaz SELECT, ktorého množina výsledkov spĺňa bežný tabuľkový výraz. Príkaz SELECT pre CTE_query_defining musí spĺňať rovnaké požiadavky ako vytvorenie zobrazenia, okrem toho, že CTE nemôže definovať iné CTE. Ďalšie informácie nájdete v časti Poznámky a CREATE VIEW (Transact-SQL). Ak je definovaných viacero nastavení CTE_query_settings, definície dotazov sa musia skombinovať s jedným z operátorov množiny UNION ALL, UNION, EXCEPT alebo INTERSECT.
Pravidlá pre definovanie a používanie rekurzívnych výrazov spoločnej tabuľky
Nasledujúce pokyny platia pre definovanie rekurzívnych bežných tabuľkových výrazov:
- Rekurzívna definícia CTE musí obsahovať aspoň dve definície dotazu CTE, kotviaci člen a rekurzívny člen. Môžete definovať viacero kotviacich a rekurzívnych členov. Všetky definície dotazu na kotvový člen však musia byť umiestnené pred definíciou prvého rekurzívneho člena. Všetky definície dotazov CTE sú kotviacimi členmi, pokiaľ neodkazujú na samotný CTE.
- Prvky kotvy musia byť kombinované s jedným z nasledujúcich operátorov množiny: UNION ALL, UNION, INTERSECT, EXCEPT. UNION ALL je jediný platný operátor množiny medzi posledným kotviacim členom a prvým rekurzívnym členom pri spájaní viacerých rekurzívnych členov. Kotva a rekurzívne prvky musia mať rovnaký počet stĺpcov.
- Typ údajov stĺpcov rekurzívneho člena musí byť rovnaký ako typ údajov zodpovedajúceho stĺpca kotviaceho člena.
- Nasledujúce položky nie sú povolené v jej definícii CTE_query_definition pre rekurzívnych členov:
Please choose a different grouping PIVOT (For database compatibility level 110 and above. See Breaking Changes to Database Engine Features in SQL Server 2016. Offal Scalar aggregation Up LEFT, RIGHT, OUTER JOIN (INNER JOIN is allowed) subquery A hint applied to recursive references to CTEs within a CTE_query_definition.>
Vytvorenie rekurzívneho výrazu spoločnej tabuľky
Rekurzívny CTE je taký, ktorý odkazuje sám na seba v rámci tohto CTE. Rekurzívny CTE je užitočný pri práci s hierarchickými údajmi, pretože CTE pokračuje vo vykonávaní, kým dotaz nevráti celú hierarchiu.
Typickým príkladom hierarchických údajov je tabuľka, ktorá obsahuje zoznam zamestnancov. Pre každého zamestnanca tabuľka poskytuje odkaz na manažéra danej osoby. Tento odkaz je sám o sebe ID zamestnanca v rámci tej istej tabuľky. Na zobrazenie hierarchie údajov o zamestnancoch môžete použiť rekurzívny CTE.
Ak sa CTE vytvorí nesprávne, môže vstúpiť do nekonečnej slučky. Aby ste tomu zabránili, do klauzuly OPTION primárneho príkazu SELECT, INSERT, UPDATE, DELETE alebo MERGE možno pridať pomôcku MAXRECURSION.
polymorfizmus v jave
Vytvorí sa tabuľka:
CREATE TABLE Employees ( EmployeeID int NOT NULL PRIMARY KEY, FirstName varchar(50) NOT NULL, LastName varchar(50) NOT NULL, ManagerID int NULL ) INSERT INTO Employees VALUES (1, 'Ken', 'Thompson', NULL) INSERT INTO Employees VALUES (2, 'Terri', 'Ryan', 1) INSERT INTO Employees VALUES (3, 'Robert', 'Durello', 1) INSERT INTO Employees VALUES (4, 'Rob', 'Bailey', 2) INSERT INTO Employees VALUES (5, 'Kent', 'Erickson', 2) INSERT INTO Employees VALUES (6, 'Bill', 'Goldberg', 3) INSERT INTO Employees VALUES (7, 'Ryan', 'Miller', 3) INSERT INTO Employees VALUES (8, 'Dane', 'Mark', 5) INSERT INTO Employees VALUES (9, 'Charles', 'Matthew', 6) INSERT INTO Employees VALUES (10, 'Michael', 'Jhonson', 6)>
Po vytvorení tabuľky Zamestnanci sa vytvorí nasledujúci príkaz SELECT, ktorému predchádza klauzula WITH, ktorá obsahuje CTE s názvom cteReports:
WITH cteReports (EmpID, FirstName, LastName, MgrID, EmpLevel) AS ( SELECT EmployeeID, FirstName, LastName, ManagerID, 1 FROM Employees WHERE ManagerID IS NULL UNION ALL SELECT e.EmployeeID, e.FirstName, e.LastName, e.ManagerID, r.EmpLevel + 1 FROM Employees e INNER JOIN cteReports r ON e.ManagerID = r.EmpID ) SELECT FirstName + ' ' + LastName AS FullName, EmpLevel, (SELECT FirstName + ' ' + LastName FROM Employees WHERE EmployeeID = cteReports.MgrID) AS Manager FROM cteReports ORDER BY EmpLevel, MgrID>
CTE teda môžu byť užitočné, keď potrebujete vygenerovať dočasné sady výsledkov, ku ktorým možno pristupovať pomocou príkazu SELECT, INSERT, UPDATE, DELETE alebo MERGE.
Funkcie a obmedzenia bežných tabuľkových výrazov v Azure
Aktuálna implementácia CTE v Azure Synapse Analytics a Analytics Platform System (PDW) má nasledujúce funkcie a obmedzenia:
- CTE možno zadať iba v príkaze SELECT.
- CTE možno zadať iba v príkaze CREATE VIEW.
- CTE možno zadať iba v príkaze CREATE TABLE AS SELECT (CTAS).
- CTE možno zadať iba v príkaze CREATE REMOTE TABLE AS SELECT (CRTAS).
- CTE možno zadať iba v príkaze CREATE EXTERNAL TABLE AS SELECT (CETAS).