The Yleiset taulukkolausekkeet (CTE) otettiin standardiin SQL:ään yksinkertaistaakseen erilaisia SQL-kyselyluokkia, joille johdettu taulukko ei vain sopinut. CTE otettiin käyttöön SQL Server 2005:ssä, yhteinen taulukkolauseke (CTE) on väliaikainen nimetty tulosjoukko, johon voit viitata VALITSE , LISÄÄ , PÄIVITTÄÄ , tai POISTAA lausunto. Voit myös käyttää CTE:tä CREATE-näkymässä osana näkymän SELECT-kyselyä. Lisäksi SQL Server 2008:sta lähtien voit lisätä CTE:n uuteen MERGE-käskyyn.
Miksi tarvitsemme CTE:tä SQL-palvelimeen?
Yleinen taulukko [vanhentunut]CTE on tehokas SQL rakenne, joka auttaa yksinkertaistamaan kyselyitä. CTE:t toimivat virtuaalisina taulukoina (tietueiden ja sarakkeiden kanssa), jotka luodaan kyselyn suorittamisen aikana, joita kysely käyttää ja poistetaan kyselyn suorittamisen jälkeen.
CTE:n käyttö
Voimme määrittää CTE:t lisäämällä WITH-lauseen suoraan SELECT-, INSERT-, UPDATE-, DELETE- tai MERGE-käskyn eteen. WITH-lause voi sisältää yhden tai useamman CTE:n pilkuilla erotettuna.
ketjuta java-merkkijono
Syntaksi:
[KANSSA [, …]]
::=
linux merkkicte_name [(sarakkeen_nimi [, …])]
AS (cte_query)
Perustelu
- Lausekkeen nimi: Kelvollinen tunniste yhteiselle taulukkolausekkeelle. Lausekkeen_nimi on oltava erilainen kuin muiden samassa WITH-lauseessa määriteltyjen yleisten taulukkolausekkeiden nimet, mutta lausekkeen_nimi voi olla sama kuin perustaulukon tai -näkymän nimi. Kaikki viittaukset lausekkeeseen_nimi kyselyssä käyttävät yhteistä taulukkolauseketta perusobjektin sijaan.
- Sarakkeen nimi: Määrittää sarakkeen nimen yleisessä taulukkolausekkeessa. Päällekkäiset nimet eivät ole sallittuja yhdessä CTE-määritelmässä. Sarakkeiden nimien määrän on vastattava CTE_query_definition-tulosjoukon sarakkeiden määrää. Sarakkeiden nimien luettelo on valinnainen vain, jos kaikilla kyselymäärityksen tuloksena olevilla sarakkeilla on eri nimet.
- CTE_QueryDefinition: Määrittää SELECT-käskyn, jonka tulosjoukko täyttää yleisen taulukkolausekkeen. SELECT-käskyn CTE_query_defining on täytettävä samat vaatimukset kuin näkymän luomisen, paitsi että CTE ei voi määrittää toista CTE:tä. Lisätietoja on kohdassa Huomautukset ja LUO NÄKYMÄ (Transact-SQL). Jos useita CTE_query_settings-asetuksia on määritetty, kyselymääritykset on yhdistettävä johonkin joukkooperaattoreista UNION ALL, UNION, EXCEPT tai INTERSECT.
Rekursiivisten yhteisten taulukkolausekkeiden määrittelyn ja käytön säännöt
Seuraavia ohjeita sovelletaan rekursiivisten yleisten taulukkolausekkeiden määrittämiseen:
- Rekursiivisen CTE-määritelmän tulee sisältää vähintään kaksi CTE-kyselymääritelmää, ankkurijäsen ja rekursiivinen jäsen. Voit määrittää useita ankkuri- ja rekursiivisia jäseniä. Kaikki ankkurijäsenkyselymääritykset on kuitenkin sijoitettava ennen ensimmäistä rekursiivista jäsenmääritystä. Kaikki CTE-kyselymääritykset ovat ankkurijäseniä, elleivät ne viittaa itse CTE:hen.
- Ankkurielementit on yhdistettävä johonkin seuraavista joukko-operaattoreista: UNION ALL, UNION, INTERSECT, EXCEPT. UNION ALL on ainoa kelvollinen joukkooperaattori viimeisen ankkurijäsenen ja ensimmäisen rekursiivisen jäsenen välillä liitettäessä useita rekursiivisia jäseniä. Ankkuri- ja rekursiivisilla elementeillä on oltava sama määrä sarakkeita.
- Rekursiivisen jäsenen sarakkeiden tietotyypin on oltava sama kuin ankkurijäsenen vastaavan sarakkeen tietotyyppi.
- Seuraavat kohteet eivät ole sallittuja hänen CTE_query_definitionissa rekursiivisille jäsenille:
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.>
Rekursiivisen yhteisen taulukkolausekkeen luominen
Rekursiivinen CTE on sellainen, joka viittaa itseensä kyseisessä CTE:ssä. Rekursiivinen CTE on hyödyllinen hierarkkisen datan kanssa työskennellessä, sillä CTE jatkaa suoritustaan, kunnes kysely palauttaa koko hierarkian.
Tyypillinen esimerkki hierarkkisista tiedoista on taulukko, joka sisältää luettelon työntekijöistä. Jokaisen työntekijän kohdalla taulukossa on viittaus kyseisen henkilön esimieheen. Tämä viite on itse työntekijätunnus samassa taulukossa. Voit käyttää rekursiivista CTE:tä työntekijätietojen hierarkian näyttämiseen.
Jos CTE luodaan väärin, se voi siirtyä äärettömään silmukkaan. Tämän estämiseksi MAXRECURSION-vihje voidaan lisätä ensisijaisen SELECT-, INSERT-, UPDATE-, DELETE- tai MERGE-käskyn OPTION-lauseeseen.
Taulukko luodaan:
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)>
Kun Työntekijät-taulukko on luotu, luodaan seuraava SELECT-lause, jota edeltää WITH-lause, joka sisältää cteReports-nimisen CTE:n:
valinta lajittele javassa
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>
Siten CTE:t voivat olla hyödyllisiä, kun sinun on luotava väliaikaisia tulosjoukkoja, joita voidaan käyttää SELECT-, INSERT-, UPDATE-, DELETE- tai MERGE-käskyllä.
Azuren yleisten taulukkolausekkeiden ominaisuudet ja rajoitukset
Nykyisellä CTE-toteutuksella Azure Synapse Analyticsissa ja Analytics Platform Systemissä (PDW) on seuraavat ominaisuudet ja rajoitukset:
- CTE voidaan määrittää vain SELECT-käskyssä.
- CTE voidaan määrittää vain CREATE VIEW -käskyssä.
- CTE voidaan määrittää vain CREATE TABLE AS SELECT (CTAS) -käskyssä.
- CTE voidaan määrittää vain CREATE REMOTE TABLE AS SELECT (CRTAS) -käskyssä.
- CTE voidaan määrittää vain CREATE EXTERNAL TABLE AS SELECT (CETAS) -käskyssä.