Microsoft SQL Server
सामान्य टेबल एक्सप्रेशन
खोज…
वाक्य - विन्यास
- के साथ cte_name [( column_name_1 , column_name_2 , ...)] AS ( cte_expression )
टिप्पणियों
सेमी-कोलोन ( ;
) वर्ण वाले पिछले कथन से CTE को अलग करना आवश्यक है।
;WITH CommonTableName (...) SELECT ... FROM CommonTableName ...
CTE का दायरा एक एकल बैच है, और केवल इसकी परिभाषा के नीचे है। एक बैच में कई CTE हो सकते हैं, और एक CTE बैच में पहले से परिभाषित एक और CTE को संदर्भित कर सकता है, लेकिन एक CTE दूसरे CTE को संदर्भित नहीं कर सकता है जिसे बाद में बैच में परिभाषित किया गया है।
कर्मचारी पदानुक्रम
टेबल सेटअप
CREATE TABLE dbo.Employees
(
EmployeeID INT NOT NULL PRIMARY KEY,
FirstName NVARCHAR(50) NOT NULL,
LastName NVARCHAR(50) NOT NULL,
ManagerID INT NULL
)
GO
INSERT INTO Employees VALUES (101, 'Ken', 'Sánchez', NULL)
INSERT INTO Employees VALUES (102, 'Keith', 'Hall', 101)
INSERT INTO Employees VALUES (103, 'Fred', 'Bloggs', 101)
INSERT INTO Employees VALUES (104, 'Joseph', 'Walker', 102)
INSERT INTO Employees VALUES (105, 'Žydrė', 'Klybė', 101)
INSERT INTO Employees VALUES (106, 'Sam', 'Jackson', 105)
INSERT INTO Employees VALUES (107, 'Peter', 'Miller', 103)
INSERT INTO Employees VALUES (108, 'Chloe', 'Samuels', 105)
INSERT INTO Employees VALUES (109, 'George', 'Weasley', 105)
INSERT INTO Employees VALUES (110, 'Michael', 'Kensington', 106)
सामान्य टेबल अभिव्यक्ति
;WITH cteReports (EmpID, FirstName, LastName, SupervisorID, 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 AS e
INNER JOIN cteReports AS r ON e.ManagerID = r.EmpID
)
SELECT
FirstName + ' ' + LastName AS FullName,
EmpLevel,
(SELECT FirstName + ' ' + LastName FROM Employees WHERE EmployeeID = cteReports.SupervisorID) AS ManagerName
FROM cteReports
ORDER BY EmpLevel, SupervisorID
आउटपुट:
पूरा नाम EmpLevel प्रबंधक का नाम केन सैंचेज़ 1 शून्य कीथ हॉल 2 केन सैंचेज़ फ्रेड ब्लॉग्स 2 केन सैंचेज़ Lyydre Klybe 2 केन सैंचेज़ जोसेफ वॉकर 3 कीथ हॉल पीटर मिलर 3 फ्रेड ब्लॉग्स सैम जैक्सन 3 Lyydre Klybe क्लो सैमुअल्स 3 Lyydre Klybe जॉर्ज वीस्ली 3 Lyydre Klybe माइकल केंसिंग्टन 4 सैम जैक्सन सीटीई का उपयोग करके nth उच्चतम वेतन प्राप्त करें
कर्मचारी तालिका:
| ID | FirstName | LastName | Gender | Salary | +------+-----------+----------+--------+--------+ | 1 | Jahangir | Alam | Male | 70000 | | 2 | Arifur | Rahman | Male | 60000 | | 3 | Oli | Ahammed | Male | 45000 | | 4 | Sima | Sultana | Female | 70000 | | 5 | Sudeepta | Roy | Male | 80000 | +------+-----------+----------+--------+--------+
CTE (सामान्य तालिका अभिव्यक्ति):
WITH RESULT AS ( SELECT SALARY, DENSE_RANK() OVER (ORDER BY SALARY DESC) AS DENSERANK FROM EMPLOYEES ) SELECT TOP 1 SALARY FROM RESULT WHERE DENSERANK = 1
2 उच्चतम वेतन खोजने के लिए बस एन के साथ 2 को बदलें। इसी तरह, 3 उच्चतम वेतन को खोजने के लिए, बस एन को 3 के साथ बदलें।
CTE का उपयोग करके डुप्लिकेट पंक्तियों को हटाएं
कर्मचारी तालिका:
| ID | FirstName | LastName | Gender | Salary | +------+-----------+----------+--------+--------+ | 1 | Mark | Hastings | Male | 60000 | | 1 | Mark | Hastings | Male | 60000 | | 2 | Mary | Lambeth | Female | 30000 | | 2 | Mary | Lambeth | Female | 30000 | | 3 | Ben | Hoskins | Male | 70000 | | 3 | Ben | Hoskins | Male | 70000 | | 3 | Ben | Hoskins | Male | 70000 | +------+-----------+----------+--------+--------+
CTE (सामान्य तालिका अभिव्यक्ति):
WITH EmployeesCTE AS ( SELECT *, ROW_NUMBER()OVER(PARTITION BY ID ORDER BY ID) AS RowNumber FROM Employees ) DELETE FROM EmployeesCTE WHERE RowNumber > 1
निष्पादन परिणाम:
| ID | FirstName | LastName | Gender | Salary | +------+-----------+----------+--------+--------+ | 1 | Mark | Hastings | Male | 60000 | | 2 | Mary | Lambeth | Female | 30000 | | 3 | Ben | Hoskins | Male | 70000 | +------+-----------+----------+--------+--------+
सीटीई का उपयोग करके तिथियों की एक तालिका बनाएं
DECLARE @startdate CHAR(8), @numberDays TINYINT SET @startdate = '20160101' SET @numberDays = 10; WITH CTE_DatesTable AS ( SELECT CAST(@startdate as date) AS [date] UNION ALL SELECT DATEADD(dd, 1, [date]) FROM CTE_DatesTable WHERE DATEADD(dd, 1, [date]) <= DateAdd(DAY, @numberDays-1, @startdate) ) SELECT [date] FROM CTE_DatesTable OPTION (MAXRECURSION 0)
यह उदाहरण तारीखों की एकल-स्तंभ तालिका देता है, जो @startdate चर में निर्दिष्ट तिथि से शुरू होती है, और अगली @numberDays तारीखों के मूल्य वापस करती है।
पुनरावर्ती CTE
यह उदाहरण दिखाता है कि इस वर्ष से 2011 (2012 - 1) तक हर साल कैसे प्राप्त किया जाए।
WITH yearsAgo ( myYear ) AS ( -- Base Case: This is where the recursion starts SELECT DATEPART(year, GETDATE()) AS myYear UNION ALL -- This MUST be UNION ALL (cannot be UNION) -- Recursive Section: This is what we're doing with the recursive call SELECT yearsAgo.myYear - 1 FROM yearsAgo WHERE yearsAgo.myYear >= 2012 ) SELECT myYear FROM yearsAgo; -- A single SELECT, INSERT, UPDATE, or DELETE
myYear 2016 2015 2014 2013 2012 2011 आप MAXRECURSION के साथ पुनरावर्ती कॉल की संख्या को सीमित करने वाले क्वेरी विकल्प के रूप में पुनरावर्तन (कोड में स्टैक ओवरफ़्लो सोचें) को नियंत्रित कर सकते हैं।
WITH yearsAgo ( myYear ) AS ( -- Base Case SELECT DATEPART(year , GETDATE()) AS myYear UNION ALL -- Recursive Section SELECT yearsAgo.myYear - 1 FROM yearsAgo WHERE yearsAgo.myYear >= 2002 ) SELECT * FROM yearsAgo OPTION (MAXRECURSION 10);
Msg 530, स्तर 16, राज्य 1, पंक्ति 2 कथन समाप्त हो गया। स्टेटमेंट पूरा होने से पहले अधिकतम 10 पुनरावृत्ति समाप्त हो गई है।
कई एएस बयानों के साथ सीटीई
;WITH cte_query_1 AS ( SELECT * FROM database.table1 ), cte_query_2 AS ( SELECT * FROM database.table2 ) SELECT * FROM cte_query_1 WHERE cte_query_one.fk IN ( SELECT PK FROM cte_query_2 )
सामान्य तालिका अभिव्यक्तियों के साथ, अल्पविराम-अलग एएस बयानों का उपयोग करके कई प्रश्न बनाना संभव है। एक क्वेरी तब किसी भी या सभी प्रश्नों को कई अलग-अलग तरीकों से संदर्भित कर सकती है, यहां तक कि उन्हें जोड़कर भी।
Modified text is an extract of the original Stack Overflow Documentationके तहत लाइसेंस प्राप्त है CC BY-SA 3.0से संबद्ध नहीं है Stack Overflow