Common_table_expression (Transact-sql)

Bir ortak tablo ifade (cte) bilinen bir geçici adlı sonuç kümesi belirtir. Bu, basit bir sorgudan elde edilen ve tek bir select, INSERT, update yürütme kapsam içinde tanımlanan veya delete deyimi. Bu fıkra, create VIEW deyimi onun tanımlayan select deyimi bir parçası olarak da kullanılabilir. Ortak bir tablo ifade kendisi başvurular içerebilir. Bu, özyinelemeli ortak tablo ifade adlandırılır.

Konu bağlantısı simgesi Transact-SQL Sözdizim Kuralları

Sözdizimi

[ WITH <common_table_expression> [ ,...n ] ]

<common_table_expression>::=
    expression_name [ ( column_name [ ,...n ] ) ]
    AS
    ( CTE_query_definition )

Bağımsız değişkenler

  • expression_name
    Ortak tablo ifade geçerli bir tanımlayıcısıdır. expression_nameaynı ile tanımlanan herhangi bir diğer ortak tablo ifade adından farklı olması <common_table_expression > yan tümcesi, ama expression_nametemel tablo veya Görünüm adı ile aynı olabilir. Herhangi bir başvuru için expression_nameortak tablo ifade ve temel nesne sorguyu kullanır.

  • column_name
    Bir sütun adı ortak tablo ifade belirtir. Yinelenen adları tek bir cte tanımı içinde izin verilmez. Belirtilen sütun adlarının sonuç kümesindeki sütun sayısını eşleşmelidir CTE_query_definition. Sütun adları listesini elde edilen tüm sütunlar için farklı ad sorgu tanımı yalnızca sağlanan isteğe bağlıdır.

  • CTE_query_definition
    Ortak tablo ifade, sonuç kümesi bir select deyimi dolduran belirtir. select deyimi için CTE_query_definitiondışında başka bir cte bir cte tanımlayamazsınız gibi bir görünüm oluşturmak için aynı gereksinimleri karşılamalıdır. Daha fazla bilgi için açıklamalar bölümüne bakın ve CREATE VIEW (Transact-SQL).

    Eğer birden fazla CTE_query_definitionise tanımlanmış, sorgu tanımlamaları kümesi Bu işleçlerden birini tarafından katılması gerekir: UNION all, UNION, except, veya INTERSECT.

Açıklamalar

Oluşturma ve ortak tablo ifadeleri kullanma yönergeleri

Özyinelemesiz ortak tablo ifadeleri için aşağıdaki yönergeleri uygulayın. Özyinelemeli ortak tablo ifadeleri için uygulanacak yönergeler için bkz: "Guidelines for tanımlama ve özyinelemeli ortak tablo ifadeleri kullanma" Bu izler.

  • Bir cte başvuran bazı ya da tüm cte sütunları tek bir select, INSERT, update veya delete deyimi tarafından izlenmesi gerekir. Bir cte, create VIEW deyimi Görünümü tanımlayan select deyimi bir parçası olarak da belirtilebilir.

  • Birden fazla cte sorgu tanımlamaları bir özyinelemesiz cte tanımlanabilir. Tanım kümesi Bu işleçlerden birini tarafından birlikte olmalıdır: UNION all, UNION, INTERSECT veya except.

  • Bir cte kendisini başvurabilir ve önceden CTEs yan tümcesi ile aynı tanımlı. İleriye referans verilmez.

  • Birden çok yan tümcesi ile birlikte bir cte belirterek izin verilmez. Örneğin, eğer bir CTE_query_definitionbir alt sorgu içeren bu alt sorgu bir iç içe geçmiş ile başka bir cte tanımlayan yan tümcesini içeremez.

  • Aşağıdaki yan tümceleri kullanılamaz CTE_query_definition:

    • order (dışında ne zaman bir top yan tümcesi belirtilen) by

    • İÇİNE

    • Sorgu ipuçları ile OPTION yan tümcesi

    • XML İÇİN

    • GÖZAT

  • Bir cte toplu bir parçası olan bir deyimde kullanıldığında, önceki deyimi bir noktalı virgül gelmelidir.

  • Bir cte başvuran bir sorgu, bir imleç tanımlamak için kullanılabilir.

  • cte tablolar uzak sunuculardaki başvurulabilir.

  • Bir cte yürütürken bir cte başvuran tüm ipuçlarını cte, onun temel tablolarda sorguları görünümlere başvuru ipuçları aynı şekilde eriştiğinde, keşfedilen diğer ipuçları ile çakışabilir. Bu durumda, sorgu hata verir.

Tanımlama ve özyinelemeli ortak tablo ifadeleri kullanma yönergeleri

Özyinelemeli ortak tablo ifade tanımlamak için aşağıdaki kurallar uygulanır:

  • Özyinelemeli cte tanımı, en az iki cte sorgu tanımlamaları, bir tutturucu üye ve özyinelemeli üye içermelidir. Birden çok bağlantı üye ve özyinelemeli üyeleri tanımlanabilir; Ancak, tüm bağlantı üye sorgu tanımlamaları ilk özyinelemeli üye tanımı önce koymak gerekir. Tüm cte sorgu tanımlarınıcte oldukları sürece çapa üyeleridir.

  • Tutturucu üye olmalıdır kombine edilebilir bir ayarlama Bu operatörler tarafından: UNION all, UNION, INTERSECT veya except. UNION all arasında geçen çapa ve ilk özyinelemeli üyesidir ve birden fazla özyinelemeli üyeleri birleştirilirken izin sadece set operatörüdür.

  • Tutturucu ve özyinelemeli üyeleri sütun sayısı aynı olması gerekir.

  • Özyinelemeli üye sütununda veri türüne karşılık gelen tutturucu üye sütununda veri türü ile aynı olmalıdır.

  • Özyinelemeli üye yan cte için yalnızca bir kez başvurmalıdır expression_name.

  • Aşağıdaki öğeler verilmez CTE_query_definitionözyinelemeli üye:

Özyinelemeli ortak tablo ifade kullanma için aşağıdaki kurallar uygulanır:

  • Özyinelemeli cte nullability katılımcı select deyimi tarafından döndürülen sütun bakılmaksızın null olabilecek tarafından döndürülen tüm sütunlar.

  • Hatalı oluşturulmuş bir özyinelemeli cte sonsuz bir döngüye neden olabilir. Özyinelemeli üye sorgu tanımını hem üst hem de alt sütunlar için aynı değerleri döndürür, örneğin, sonsuz bir döngü oluşturulur. Sonsuz bir döngü önlemek için INSERT, update, delete veya bir select deyimi içinde seçenek yan MAXRECURSION ipucu ve 0-32.767 arasında bir değer kullanarak belirli bir deyimi izin özyineleme düzeyi sayısını sınırlayabilirsiniz. Bu döngü oluştururken kod sorunu çözmek kadar deyimi yürütülmesini denetlemenizi sağlar. Sunucu bazındaki varsayılan değer 100'dür. 0 Belirtilirse, hiçbir sınırı uygulanır. Tek MAXRECURSION değeri deyimi belirtilebilir. Daha fazla bilgi için, bkz. Sorgu ipuçları (Transact-sql).

  • Özyinelemeli ortak tablo ifade içeren bir görünüm, verileri güncelleştirmek için kullanılamaz.

  • İmleçler CTEs kullanarak sorguları kullanılarak tanımlanabilir. cte olduğunu select_statementimleç sonuç kümesini tanımlayan bağımsız. Sadece hızlı yalnızca ileri ve statik (anlık görüntü) imleçler için özyinelemeli CTEs izin verilir. Başka bir imleç türü bir özyinelemeli cte belirtilirse, imleç türü için statik dönüştürülür.

  • Uzak sunuculardaki tablolara cte başvuru. Uzak sunucu cte özyinelemeli üyesinin içinde başvurulan tablolar art arda yerel olarak erişilebilen bu yüzden bir biriktirme uzak her tablo için oluşturulur. Bir cte sorguysa, dizin biriktirme/tembel biriktiricileri sorgu planını görüntülenir ve ek yığın ile yüklem olur. Bu uygun özyineleme onaylamak için bir yoludur.

  • cte özyinelemeli parçası analitik ve toplama işlevleri kümesi için geçerli özyineleme düzeyi ve kümesi cte için uygulanır. Onlara göre geçerli özyineleme düzeyi geçirilen verilerin alt kümesini ve veri pased cte özyinelemeli parçası değil tüm kümesini row_number gibi işlevleri çalışır. Daha fazla bilgi için, bkz. J. Using analytical functions in a recursive CTE.

Örnekler

A.Basit bir ortak tablo ifade oluşturma

Aşağıdaki örnek her satış temsilcisi için her yıl satış siparişlerinin sayısı gösterir Adventure Works Cycles.

USE AdventureWorks2012;
GO
-- Define the CTE expression name and column list.
WITH Sales_CTE (SalesPersonID, SalesOrderID, SalesYear)
AS
-- Define the CTE query.
(
    SELECT SalesPersonID, SalesOrderID, YEAR(OrderDate) AS SalesYear
    FROM Sales.SalesOrderHeader
    WHERE SalesPersonID IS NOT NULL
)
-- Define the outer query referencing the CTE name.
SELECT SalesPersonID, COUNT(SalesOrderID) AS TotalSales, SalesYear
FROM Sales_CTE
GROUP BY SalesYear, SalesPersonID
ORDER BY SalesPersonID, SalesYear;
GO

B.Sayıları ve rapor ortalamalar sınırlamak için ortak bir tablo ifade kullanma

Aşağıdaki örnek, satış temsilcileri için satış siparişleri tüm yıl için ortalama sayısını gösterir.

WITH Sales_CTE (SalesPersonID, NumberOfOrders)
AS
(
    SELECT SalesPersonID, COUNT(*)
    FROM Sales.SalesOrderHeader
    WHERE SalesPersonID IS NOT NULL
    GROUP BY SalesPersonID
)
SELECT AVG(NumberOfOrders) AS "Average Sales Per Person"
FROM Sales_CTE;
GO

C.Birden çok düzeyi özyineleme görüntülemek için özyinelemeli ortak tablo ifade kullanma

Aşağıdaki örnek, yöneticileri ve onlara rapor çalışanlar hiyerarşik bir listesini gösterir. Örnek oluşturma ve doldurma başlıyor dbo.MyEmployeestablosu.

-- Create an Employee table.
CREATE TABLE dbo.MyEmployees
(
    EmployeeID smallint NOT NULL,
    FirstName nvarchar(30)  NOT NULL,
    LastName  nvarchar(40) NOT NULL,
    Title nvarchar(50) NOT NULL,
    DeptID smallint NOT NULL,
    ManagerID int NULL,
 CONSTRAINT PK_EmployeeID PRIMARY KEY CLUSTERED (EmployeeID ASC) 
);
-- Populate the table with values.
INSERT INTO dbo.MyEmployees VALUES 
 (1, N'Ken', N'Sánchez', N'Chief Executive Officer',16,NULL)
,(273, N'Brian', N'Welcker', N'Vice President of Sales',3,1)
,(274, N'Stephen', N'Jiang', N'North American Sales Manager',3,273)
,(275, N'Michael', N'Blythe', N'Sales Representative',3,274)
,(276, N'Linda', N'Mitchell', N'Sales Representative',3,274)
,(285, N'Syed', N'Abbas', N'Pacific Sales Manager',3,273)
,(286, N'Lynn', N'Tsoflias', N'Sales Representative',3,285)
,(16,  N'David',N'Bradley', N'Marketing Manager', 4, 273)
,(23,  N'Mary', N'Gibson', N'Marketing Specialist', 4, 16);

USE AdventureWorks2012;
GO
WITH DirectReports(ManagerID, EmployeeID, Title, EmployeeLevel) AS 
(
    SELECT ManagerID, EmployeeID, Title, 0 AS EmployeeLevel
    FROM dbo.MyEmployees 
    WHERE ManagerID IS NULL
    UNION ALL
    SELECT e.ManagerID, e.EmployeeID, e.Title, EmployeeLevel + 1
    FROM dbo.MyEmployees AS e
        INNER JOIN DirectReports AS d
        ON e.ManagerID = d.EmployeeID 
)
SELECT ManagerID, EmployeeID, Title, EmployeeLevel 
FROM DirectReports
ORDER BY ManagerID;
GO

D.İki düzeyi özyineleme görüntülemek için özyinelemeli ortak tablo ifade kullanma

Aşağıdaki örnek, yöneticileri ve onlara rapor çalışanlar gösterilir. Döndürülen düzeylerinin sayısını iki olarak sınırlıdır.

USE AdventureWorks2012;
GO
WITH DirectReports(ManagerID, EmployeeID, Title, EmployeeLevel) AS 
(
    SELECT ManagerID, EmployeeID, Title, 0 AS EmployeeLevel
    FROM dbo.MyEmployees 
    WHERE ManagerID IS NULL
    UNION ALL
    SELECT e.ManagerID, e.EmployeeID, e.Title, EmployeeLevel + 1
    FROM dbo.MyEmployees AS e
        INNER JOIN DirectReports AS d
        ON e.ManagerID = d.EmployeeID 
)
SELECT ManagerID, EmployeeID, Title, EmployeeLevel 
FROM DirectReports
WHERE EmployeeLevel <= 2 ;
GO

E.Hiyerarşik bir liste görüntülemek için özyinelemeli ortak tablo ifade kullanma

Aşağıdaki örnekte, yönetici ve çalışanlar ve onların ilgili başlıklar adlarını ekleyerek örnek c oluşturur. Yöneticiler ve çalışanlar hiyerarşi, ayrıca her düzeyde girintileme tarafından vurgulanmaktadır.

USE AdventureWorks2012;
GO
WITH DirectReports(Name, Title, EmployeeID, EmployeeLevel, Sort)
AS (SELECT CONVERT(varchar(255), e.FirstName + ' ' + e.LastName),
        e.Title,
        e.EmployeeID,
        1,
        CONVERT(varchar(255), e.FirstName + ' ' + e.LastName)
    FROM dbo.MyEmployees AS e
    WHERE e.ManagerID IS NULL
    UNION ALL
    SELECT CONVERT(varchar(255), REPLICATE ('|    ' , EmployeeLevel) +
        e.FirstName + ' ' + e.LastName),
        e.Title,
        e.EmployeeID,
        EmployeeLevel + 1,
        CONVERT (varchar(255), RTRIM(Sort) + '|    ' + FirstName + ' ' + 
                 LastName)
    FROM dbo.MyEmployees AS e
    JOIN DirectReports AS d ON e.ManagerID = d.EmployeeID
    )
SELECT EmployeeID, Name, Title, EmployeeLevel
FROM DirectReports 
ORDER BY Sort;
GO

F.Bir deyimi iptal etmek için MAXRECURSION kullanma

MAXRECURSIONKötü oluşturulmuş bir özyinelemeli cte sonsuz bir döngüye girmesini önlemek için kullanılabilir. Aşağıdaki örnek isteyerek sonsuz bir döngü oluşturur ve kullanır MAXRECURSIONiki özyineleme düzeyi sayısını sınırlamak için ipucu.

USE AdventureWorks2012;
GO
--Creates an infinite loop
WITH cte (EmployeeID, ManagerID, Title) as
(
    SELECT EmployeeID, ManagerID, Title
    FROM dbo.MyEmployees
    WHERE ManagerID IS NOT NULL
  UNION ALL
    SELECT cte.EmployeeID, cte.ManagerID, cte.Title
    FROM cte 
    JOIN  dbo.MyEmployees AS e 
        ON cte.ManagerID = e.EmployeeID
)
--Uses MAXRECURSION to limit the recursive levels to 2
SELECT EmployeeID, ManagerID, Title
FROM cte
OPTION (MAXRECURSION 2);
GO

USE AdventureWorks2012;
GO
--Creates an infinite loop
WITH cte (EmployeeID, ManagerID, Title) as
(
    SELECT EmployeeID, ManagerID, Title
    FROM dbo.MyEmployees
    WHERE ManagerID IS NOT NULL
  UNION ALL
    SELECT cte.EmployeeID, cte.ManagerID, cte.Title
    FROM cte 
    JOIN  dbo.MyEmployees AS e 
        ON cte.ManagerID = e.EmployeeID
)
--Uses MAXRECURSION to limit the recursive levels to 2
SELECT EmployeeID, ManagerID, Title
FROM cte
OPTION (MAXRECURSION 2);
GO

Kodlama hatası düzeltilmiş sonra MAXRECURSION artık gerekli değildir. Aşağıdaki örnek, düzeltilmiş kodunu gösterir.

USE AdventureWorks2012;
GO
WITH cte (EmployeeID, ManagerID, Title)
AS
(
    SELECT EmployeeID, ManagerID, Title
    FROM dbo.MyEmployees
    WHERE ManagerID IS NOT NULL
  UNION ALL
    SELECT  e.EmployeeID, e.ManagerID, e.Title
    FROM dbo.MyEmployees AS e
    JOIN cte ON e.ManagerID = cte.EmployeeID
)
SELECT EmployeeID, ManagerID, Title
FROM cte;
GO

USE AdventureWorks2012;
GO
WITH cte (EmployeeID, ManagerID, Title)
AS
(
    SELECT EmployeeID, ManagerID, Title
    FROM dbo.MyEmployees
    WHERE ManagerID IS NOT NULL
  UNION ALL
    SELECT  e.EmployeeID, e.ManagerID, e.Title
    FROM dbo.MyEmployees AS e
    JOIN cte ON e.ManagerID = cte.EmployeeID
)
SELECT EmployeeID, ManagerID, Title
FROM cte;
GO

G.Seçime bağlı olarak bir select deyimi içinde bir özyinelemeli ilişki için ortak bir tablo ifade kullanma

Aşağıdaki örnek, ürün birleştirmeleri ve bisiklet için oluşturmak için gereken bileşenleri hiyerarşisini gösterir ProductAssemblyID = 800.

USE AdventureWorks2012;
GO
WITH Parts(AssemblyID, ComponentID, PerAssemblyQty, EndDate, ComponentLevel) AS
(
    SELECT b.ProductAssemblyID, b.ComponentID, b.PerAssemblyQty,
        b.EndDate, 0 AS ComponentLevel
    FROM Production.BillOfMaterials AS b
    WHERE b.ProductAssemblyID = 800
          AND b.EndDate IS NULL
    UNION ALL
    SELECT bom.ProductAssemblyID, bom.ComponentID, p.PerAssemblyQty,
        bom.EndDate, ComponentLevel + 1
    FROM Production.BillOfMaterials AS bom 
        INNER JOIN Parts AS p
        ON bom.ProductAssemblyID = p.ComponentID
        AND bom.EndDate IS NULL
)
SELECT AssemblyID, ComponentID, Name, PerAssemblyQty, EndDate,
        ComponentLevel 
FROM Parts AS p
    INNER JOIN Production.Product AS pr
    ON p.ComponentID = pr.ProductID
ORDER BY ComponentLevel, AssemblyID, ComponentID;
GO

H.Bir özyinelemeli cte bir update deyimi kullanarak

Aşağıdaki örnek güncelleştirmeleri PerAssemblyQtydeğer, ürün ' Road-550-w sarı, 44' oluşturmak için kullanılan tüm parçalar için (ProductAssemblyID 800). Ortak tablo ifade oluşturmak için kullanılan bölümleri hiyerarşik bir listesini döndürür ProductAssemblyID 800ve bölümleri vb. oluşturmak için kullanılan bileşenler. Ortak tablo ifade tarafından döndürülen satırları değiştirilir.

USE AdventureWorks2012;
GO
WITH Parts(AssemblyID, ComponentID, PerAssemblyQty, EndDate, ComponentLevel) AS
(
    SELECT b.ProductAssemblyID, b.ComponentID, b.PerAssemblyQty,
        b.EndDate, 0 AS ComponentLevel
    FROM Production.BillOfMaterials AS b
    WHERE b.ProductAssemblyID = 800
          AND b.EndDate IS NULL
    UNION ALL
    SELECT bom.ProductAssemblyID, bom.ComponentID, p.PerAssemblyQty,
        bom.EndDate, ComponentLevel + 1
    FROM Production.BillOfMaterials AS bom 
        INNER JOIN Parts AS p
        ON bom.ProductAssemblyID = p.ComponentID
        AND bom.EndDate IS NULL
)
UPDATE Production.BillOfMaterials
SET PerAssemblyQty = c.PerAssemblyQty * 2
FROM Production.BillOfMaterials AS c
JOIN Parts AS d ON c.ProductAssemblyID = d.AssemblyID
WHERE d.ComponentLevel = 0; 

I.Tutturucu ve özyinelemeli üyeleri birden fazla kullanma

Aşağıdaki örnek, belirtilen bir kişinin bütün ataları döndürmek için birden fazla tutturucu ve özyinelemeli üyeleri kullanır. Bir tablo oluşturulur ve özyinelemeli cte tarafından döndürülen aile Soyağacı kurmak için değerler eklenir.

-- Genealogy table
IF OBJECT_ID('dbo.Person','U') IS NOT NULL DROP TABLE dbo.Person;
GO
CREATE TABLE dbo.Person(ID int, Name varchar(30), Mother int, Father int);
GO
INSERT dbo.Person 
VALUES(1, 'Sue', NULL, NULL)
      ,(2, 'Ed', NULL, NULL)
      ,(3, 'Emma', 1, 2)
      ,(4, 'Jack', 1, 2)
      ,(5, 'Jane', NULL, NULL)
      ,(6, 'Bonnie', 5, 4)
      ,(7, 'Bill', 5, 4);
GO
-- Create the recursive CTE to find all of Bonnie's ancestors.
WITH Generation (ID) AS
(
-- First anchor member returns Bonnie's mother.
    SELECT Mother 
    FROM dbo.Person
    WHERE Name = 'Bonnie'
UNION
-- Second anchor member returns Bonnie's father.
    SELECT Father 
    FROM dbo.Person
    WHERE Name = 'Bonnie'
UNION ALL
-- First recursive member returns male ancestors of the previous generation.
    SELECT Person.Father
    FROM Generation, Person
    WHERE Generation.ID=Person.ID
UNION ALL
-- Second recursive member returns female ancestors of the previous generation.
    SELECT Person.Mother
    FROM Generation, dbo.Person
    WHERE Generation.ID=Person.ID
)
SELECT Person.ID, Person.Name, Person.Mother, Person.Father
FROM Generation, dbo.Person
WHERE Generation.ID = Person.ID;
GO

J.Bir özyinelemeli cte analitik işlevler kullanma

Aşağıdaki örnek, bir cte özyinelemeli parçası analitik veya toplama işlevinde kullanıldığında oluşan tuzak gösterir.

DECLARE @t1 TABLE (itmID int, itmIDComp int);
INSERT @t1 VALUES (1,10), (2,10); 

DECLARE @t2 TABLE (itmID int, itmIDComp int); 
INSERT @t2 VALUES (3,10), (4,10); 

WITH vw AS
 (
    SELECT itmIDComp, itmID
    FROM @t1

    UNION ALL

    SELECT itmIDComp, itmID
    FROM @t2
) 
,r AS
 (
    SELECT t.itmID AS itmIDComp
           , NULL AS itmID
           ,CAST(0 AS bigint) AS N
           ,1 AS Lvl
    FROM (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) AS t (itmID) 

UNION ALL

SELECT t.itmIDComp
    , t.itmID
    , ROW_NUMBER() OVER(PARTITION BY t.itmIDComp ORDER BY t.itmIDComp, t.itmID) AS N
    , Lvl + 1
FROM r 
    JOIN vw AS t ON t.itmID = r.itmIDComp
) 

SELECT Lvl, N FROM r;

DECLARE @t1 TABLE (itmID int, itmIDComp int);
INSERT @t1 VALUES (1,10), (2,10); 

DECLARE @t2 TABLE (itmID int, itmIDComp int); 
INSERT @t2 VALUES (3,10), (4,10); 

WITH vw AS
 (
    SELECT itmIDComp, itmID
    FROM @t1

    UNION ALL

    SELECT itmIDComp, itmID
    FROM @t2
) 
,r AS
 (
    SELECT t.itmID AS itmIDComp
           , NULL AS itmID
           ,CAST(0 AS bigint) AS N
           ,1 AS Lvl
    FROM (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) AS t (itmID) 

UNION ALL

SELECT t.itmIDComp
    , t.itmID
    , ROW_NUMBER() OVER(PARTITION BY t.itmIDComp ORDER BY t.itmIDComp, t.itmID) AS N
    , Lvl + 1
FROM r 
    JOIN vw AS t ON t.itmID = r.itmIDComp
) 

SELECT Lvl, N FROM r;

Aşağıdaki sonuçları sorgusu için beklenen sonuçlar vardır.

Lvl  N
1    0
1    0
1    0
1    0
2    4
2    3
2    2
2    1

Lvl  N
1    0
1    0
1    0
1    0
2    4
2    3
2    2
2    1

Aşağıdaki sonuçları sorgusu için gerçek sonuçlar vardır.

Lvl  N
1    0
1    0
1    0
1    0
2    1
2    1
2    1
2    1

Lvl  N
1    0
1    0
1    0
1    0
2    1
2    1
2    1
2    1

Nher geçişte cte özyinelemeli parçası 1 döndürür, çünkü yalnızca veri alt kümesini özyineleme düzeyi için geçer ROWNUMBER. Her sorgu özyinelemeli parçası yineleme için yalnızca bir satır geçirilir ROWNUMBER.

Ayrıca bkz.

Başvuru

CREATE VIEW (Transact-SQL)

Sil (Transact-sql)

DIŞINDA ve INTERSECT (Transact-sql)

Insert (Transact-sql)

select (Transact-sql)

Güncelleştirme (Transact-sql)