TOP (Transact-sql)

Satırları bir sorgu sonucunda dönen sınırlarını belirli sayıda satır veya satırları yüzdesi SQL Server 2012. top, order by yan tümcesi ile birlikte kullanıldığında, sonuç kümesindeki ilk sınırlı NSipariş satır; Aksi takdirde, ilk döner Nrasgele satırların sayısı. BİRLEŞTİRME veya delete deyimi, bir select deyimi döndürülen satırların sayısını belirtin veya etkilenen bir INSERT, update için bu yan tümcesi kullanın.

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

Sözdizimi

[ 
    TOP (expression) [PERCENT]
    [ WITH TIES ]
]

Bağımsız değişkenler

  • expression
    Döndürülecek satır numarasını belirten sayısal ifade iş. expressionörtülü olarak dönüştürülür bir floatdeğeri yüzde belirtilirse; Aksi takdirde, o dönüştürülür bigint.

  • YÜZDE
    Sorgunun yalnızca ilk döndürdüğünü gösterir expressionyüzde, sonuç kümesinde satırların. Kesirli değerler sonraki tamsayı değerine yuvarlanır.

  • WITH TIES
    Sorgu sonuç kümesi sütunu order by veya döndürülen son satırda sütun değerleri eşleşen herhangi bir ek satırları içeren belirtir. Bu belirtilen değere döndürülecek daha fazla satır neden olabilir expression. Örneğin, eğer expression5 ama 2 için ayarlanmış ek satırların eşleşen satır 5 order by sütunları değerleri, 7 satır sonuç kümesi içerir.

    Sayfanın Üstü...WITH TIES, yalnızca select deyimi içinde belirtilen ve order by yan tümcesi belirtilirse, sadece olabilir. Döndürülen ipe kayıtların rasgele sırasıdır. order by bu kural etkilemez.

En İyi Yöntemler

select deyimi içinde her zaman ile top yan tümcesi bir order by yan tümcesi kullanın. Tahmin edilebileceği gibi hangi satırların üst tarafından etkilendiğini belirtmek için tek yol budur.

Kullanın ofset ve order by yan tümcesinde top yan tümcesi yerine getirme sorgu uygulamaya belleği çözüm. (Topakları veya "sayfalarında" gönderiyor bir disk belleği çözüm veri istemciye) uzaklık ve getirme yan tümcelerini kullanarak uygulamak kolaydır. Daha fazla bilgi için, bkz. order by yan tümcesi (Transact-sql).

Kullanım üst (veya uzaklığı ve getirme) set rowcount yerine satır sayısını sınırlamak için döndü. Bu yöntemler aşağıdaki nedenlerle set rowcount kullanarak üzerinden tercih edilir:

  • De SQL Server 2012, Sil, Ekle, birleştirme ve GÜNCELLEŞTIR deyimleri set rowcount etkilemez. 

  • Bir select deyimi bir parçası olarak sorgu iyileştirici değeri dikkate olabilir expressionsorgu en iyi duruma getirme sırasında üst veya getirme yan. set rowcount bir sorgu yürütür bir deyimi dışında kullanıldığından, değeri bir sorgu planı kabul edilemez.

Uyumluluk Desteği

Geriye dönük uyumluluk için ayraç Seç deyimlerinde isteğe bağlıdır. Size her zaman ayraç için üst tutarlılığı Seç deyimlerinde INSERT, update, birleştirme gerekli kullanımı ile kullanın ve delete deyimlerini parantez gerekli olan öneririz.

Birlikte Çalışabilirlik

En iyi ifade nedeniyle tetikleyici yürütülebilecek deyimleri etkilemez. insertedVe deletedtablolarda Tetikleyiciler, yalnızca gerçekten INSERT, update, birleştirme veya delete deyimleri tarafından etkilenen satırların dönecektir. Örneğin, INSERT tetikleyici bir top yan tümcesi kullanılan INSERT deyimi sonucu olarak pişirilir,

SQL Servergörünümleri aracılığıyla satırları güncelleştirmek için izin verir. top yan tümcesi görünüm tanımına dahil edilebilir çünkü belirli satırları satır artık en iyi ifade gereksinimlerini, görünümden bir güncelleştirme nedeniyle kaybolabilirler.

BIRLEŞTIRME deyiminde belirtilen, top yan tümcesi uygulanır sonra tüm kaynak tablo ve tüm hedef tablo katıldı ve bir INSERT, update veya delete eylem için geçerli olmayan birleştirilmiş satırlar kaldırılır. Daha top yan tümcesi belirtilen değere birleştirilen satır sayısını azaltır ve INSERT, update veya delete eylemleri kalan birleştirilen satır Rakamsız bir şekilde uygulanır. Yani, orada hiçbir sipariş satırları olduğunda yan tümceleri içinde tanımlanan eylemler arasında dağıtılır. Örneğin, üst (10) etkiler 10 satır belirtme; Bu satır 7 güncelleştirilebilir ve 3 eklenmiş, veya 1 silinebilir, 5 Güncellenme ve 4 eklenen ve benzeri. BIRLEŞTIRME deyimini hem kaynak hem de hedef tabloları tam tablo tarama gerçekleştirdiğinden, top yan tümcesi birden çok toplu işlemi oluşturarak büyük bir tabloyu değiştirmek için kullanıldığında g/Ç performansı etkilenebilir. Bu senaryoda, tüm ardışık toplu yeni satırlar hedef sağlamak önemlidir.

top yan tümcesi içeren bir Birliği, UNION all except sorguda belirtirken dikkatli veya INTERSECT işleci. Bu operatörler bir seçme işleminde kullanılan top ve order by yan tümceleri mantıksal olarak işlenme sırasını her zaman kolay değildir çünkü beklenmedik sonuçları döndüren bir sorgu yazmak mümkündür. Örneğin, aşağıdaki tablo ve veri alındığında, en pahalı kırmızı araba ve en pahalı mavi araba dönmek istediğinizi varsayalım. Yani kırmızı sedan ve mavi van.

CREATE TABLE dbo.Cars(Model varchar(15), Price money, Color varchar(10));
INSERT dbo.Cars VALUES
    ('sedan', 10000, 'red'), ('convertible', 15000, 'blue'), 
    ('coupe', 20000, 'red'), ('van', 8000, 'blue');

CREATE TABLE dbo.Cars(Model varchar(15), Price money, Color varchar(10));
INSERT dbo.Cars VALUES
    ('sedan', 10000, 'red'), ('convertible', 15000, 'blue'), 
    ('coupe', 20000, 'red'), ('van', 8000, 'blue');

Bu sonuçlar elde etmek için aşağıdaki sorgu yazmak olabilir.

SELECT TOP(1) Model, Color, Price
FROM dbo.Cars
WHERE Color = 'red'
UNION ALL
SELECT TOP(1) Model, Color, Price
FROM dbo.Cars
WHERE Color = 'blue'
ORDER BY Price ASC;

SELECT TOP(1) Model, Color, Price
FROM dbo.Cars
WHERE Color = 'red'
UNION ALL
SELECT TOP(1) Model, Color, Price
FROM dbo.Cars
WHERE Color = 'blue'
ORDER BY Price ASC;

Sonuç kümesi buradadır.

Model         Color      Price

------------- ---------- -------

sedan         red        10000.00

convertible   blue       15000.00

top yan tümcesi mantıklı olan (Bu durumda'UNION all) işleci sonuçları sıralar order by yan tümcesi önce yürütülür çünkü beklenmedik sonuçları döndürülür. Böylece, önceki sorgunun herhangi bir kırmızı araba ve herhangi bir mavi araba döndürür ve sonra bu Birliği sonucu fiyatıyla sipariş. Aşağıdaki örnek, istenen sonucu elde etmek için bu sorgu yazma doğru yöntemi gösterilir.

SELECT Model, Color, Price
FROM (SELECT TOP(1) Model, Color, Price
      FROM dbo.Cars
      WHERE Color = 'red'
      ORDER BY Price ASC) AS a
UNION ALL
SELECT Model, Color, Price
FROM (SELECT TOP(1) Model, Color, Price
      FROM dbo.Cars
      WHERE Color = 'blue'
      ORDER BY Price ASC) AS b;

SELECT Model, Color, Price
FROM (SELECT TOP(1) Model, Color, Price
      FROM dbo.Cars
      WHERE Color = 'red'
      ORDER BY Price ASC) AS a
UNION ALL
SELECT Model, Color, Price
FROM (SELECT TOP(1) Model, Color, Price
      FROM dbo.Cars
      WHERE Color = 'blue'
      ORDER BY Price ASC) AS b;

top ve order by subselect bir işlemi kullanarak, order by yan sonuçları kullanılır ki top yan tümcesi ve UNION işleminin sonucu değil sıralama uygulanır sağlamak.

Sonuç kümesi buradadır.

Model         Color      Price

------------- ---------- -------

sedan         red        10000.00

van           blue        8000.00

Sınırlamalar ve Kısıtlamalar

top INSERT, update, birleştirme veya silme ile kullanıldığında, bulunulan satır herhangi bir sırayla düzenlenir değildir ve order by yan tümcesi doğrudan bu ifadeler belirtilebilir değil. ÜST satırların anlamlı bir kronolojik sırayla değiştirmek eklemek veya silmek için kullanmanız gerekiyorsa, top subselect deyimi içinde belirtilen bir order by yan tümcesi ile birlikte kullanmanız gerekir. Bu konuda aşağıdaki örnekler bölümüne bakın.

top bir update ve delete deyimlerinde bölümlendirilmiş görünümlerde kullanılamaz.

top uzaklığı ile birlikte ve aynı sorgu ifadesinde (aynı kapsamda sorgu) getir. Daha fazla bilgi için, bkz. order by yan tümcesi (Transact-sql).

Örnekler

Kategori

Seçme sözdizimi öğeleri

Temel sözdizimi

ÜST • YÜZDE

Kravat değerleri dahil

WITH TIES

delete, INSERT veya update tarafından etkilenen satırların sınırlama

• EKLE GÜNCELLEŞTİRME SİL

Temel sözdizimi

Bu bölümdeki örnekler, en az gerekli sözdizimini kullanarak order by yan tümcesi temel işlevselliğini göstermektedir.

A.Sabit bir değer ile top kullanma

Aşağıdaki örnekler, sorgunun sonuç kümesinde döndürülen çalışanların sayısını belirtmek için sabit bir değer kullanın. order by yan tümcesini kullanılmaz çünkü ilk örnek, ilk 10 rastgele satır döndürülür. İkinci örnekte, order by yan tümcesi en iyi 10 son zamanlarda çalışanların işe dönmek için kullanılır.

USE AdventureWorks2012;
GO
-- Select the first 10 random employees.
SELECT TOP(10)JobTitle, HireDate
FROM HumanResources.Employee;
GO
-- Select the first 10 employees hired most recently.
SELECT TOP(10)JobTitle, HireDate
FROM HumanResources.Employee
ORDER BY HireDate DESC;

B.top bir değişkeni ile kullanma

Aşağıdaki örnek bir değişken sorgu sonuç kümesinde döndürülen çalışanların sayısını belirtmek için kullanır.

USE AdventureWorks2012;
GO
DECLARE @p AS int = 10;
SELECT TOP(@p)JobTitle, HireDate, VacationHours
FROM HumanResources.Employee
ORDER BY VacationHours DESC
GO

C.Yüzdeyi belirtme

Aşağıdaki örnek, sorgu sonuç kümesinde döndürülen çalışanların sayısını belirtmek için yüzde kullanır. 290 Çalışanlar var HumanResources.Employeetablosu. Değeri 290 yüzde 5'i kesirli bir değer olduğundan, sonraki tamsayıya yuvarlanır.

USE AdventureWorks2012;
GO
SELECT TOP(5)PERCENT JobTitle, HireDate
FROM HumanResources.Employee
ORDER BY HireDate DESC;

Kravat değerleri dahil

A.Kullanma ile son satırdaki değerlerle eşleşen satırları içermek için bağları

Aşağıdaki örnekte üst alır 10en yüksek maaş ve döner azalan bir tanesi kendi maaş göre sipariş tüm çalışanların yüzde. Belirtme WITH TIESbunu aşsa bile tüm çalışanların maaşları düşük maaş (son satır) döndürülen eşit olan da sonuç kümesinde dahil edildiğinden emin kılan 10çalışanların yüzde.

USE AdventureWorks2012;
GO
SELECT TOP(10)WITH TIES
pp.FirstName, pp.LastName, e.JobTitle, e.Gender, r.Rate
FROM Person.Person AS pp 
    INNER JOIN HumanResources.Employee AS e
        ON pp.BusinessEntityID = e.BusinessEntityID
    INNER JOIN HumanResources.EmployeePayHistory AS r
        ON r.BusinessEntityID = e.BusinessEntityID
ORDER BY Rate DESC;

delete, INSERT veya update tarafından etkilenen satırların sınırlama

A.Silinen satır sayısını sınırlamak için top kullanma

Ne zaman bir üst (n) yan tümcesi, delete ile kullanıldığında, rastgele bir seçim üzerinde silme işlemi gerçekleştirilir nsatır sayısı. Aşağıdaki örnek 20rasgele satırların PurchaseOrderDetaildolayı sahip tablo 1 Temmuz 2002 ' önceki tarihleri.

USE AdventureWorks2012;
GO
DELETE TOP (20) 
FROM Purchasing.PurchaseOrderDetail
WHERE DueDate < '20020701';
GO

Anlamlı bir kronolojik sırayla satırları silmek için üst kullanmanız gerekiyorsa, subselect deyimi içinde top sipariş ile birlikte kullanmanız gerekir. Aşağıdaki sorgu 10 satırları siler PurchaseOrderDetailen erken son tarihi olan tablo. Yalnızca 10 satır olmasını sağlamak için silinmiş subselect deyimi içinde belirtilen sütun (PurchaseOrderID) tablonun birincil anahtarıdır. Belirtilen sütun yinelenen değerler içeriyorsa bir nonkey sütun alt kullanarak 10'dan fazla satır silinmesine deyimi neden.

USE AdventureWorks2012;
GO
DELETE FROM Purchasing.PurchaseOrderDetail
WHERE PurchaseOrderDetailID IN
   (SELECT TOP 10 PurchaseOrderDetailID 
    FROM Purchasing.PurchaseOrderDetail 
    ORDER BY DueDate ASC);
GO

B.Eklenen satır sayısını sınırlamak için top kullanma

Aşağıdaki örnek tablo oluşturur EmployeeSalesve adını ve tablonun üst 5 rastgele çalışanlar için yıllık tarihi satış verilerini ekler HumanResources.Employee. INSERT deyimi tarafından döndürülen 5 satırları seçer SELECTdeyimi. output yan tümcesi eklenir satırları görüntüler EmployeeSalestablosu. order by yan tümcesi select deyimi içinde en iyi 5 çalışanı belirlemek için kullanılmadığını unutmayın.

USE AdventureWorks2012 ;
GO
IF OBJECT_ID ('dbo.EmployeeSales', 'U') IS NOT NULL
    DROP TABLE dbo.EmployeeSales;
GO
CREATE TABLE dbo.EmployeeSales
( EmployeeID   nvarchar(11) NOT NULL,
  LastName     nvarchar(20) NOT NULL,
  FirstName    nvarchar(20) NOT NULL,
  YearlySales  money NOT NULL
 );
GO
INSERT TOP(5)INTO dbo.EmployeeSales
    OUTPUT inserted.EmployeeID, inserted.FirstName, inserted.LastName, inserted.YearlySales
    SELECT sp.BusinessEntityID, c.LastName, c.FirstName, sp.SalesYTD 
    FROM Sales.SalesPerson AS sp
    INNER JOIN Person.Person AS c
        ON sp.BusinessEntityID = c.BusinessEntityID
    WHERE sp.SalesYTD > 250000.00
    ORDER BY sp.SalesYTD DESC;

Anlamlı bir tarih sırasına göre satır eklemek için üst kullanmanız gerekiyorsa, aşağıdaki örnekte gösterildiği gibi top ile birlikte order by subselect deyimi içinde kullanmalısınız. output yan tümcesi eklenir satırları görüntüler EmployeeSalestablosu. En iyi 5 çalışanlar artık rastgele satır yerine order by yan tümcesi sonuçlarına göre eklenen dikkat edin.

INSERT INTO dbo.EmployeeSales
    OUTPUT inserted.EmployeeID, inserted.FirstName, inserted.LastName, inserted.YearlySales
    SELECT TOP (5) sp.BusinessEntityID, c.LastName, c.FirstName, sp.SalesYTD 
    FROM Sales.SalesPerson AS sp
    INNER JOIN Person.Person AS c
        ON sp.BusinessEntityID = c.BusinessEntityID
    WHERE sp.SalesYTD > 250000.00
    ORDER BY sp.SalesYTD DESC;

B.Güncelleştirilen satır sayısını sınırlamak için top kullanma

Aşağıdaki örnek, top yan tümcesi için kullanır.

Ne zaman bir üst (n) yan tümcesi güncelleme ile kullanıldığında, güncelleştirme işlemi rastgele bir seçim üzerinde gerçekleştirilecek 'n' satır sayısı. Aşağıdaki örnek, rasgele bir sayı 10 müşterilerinin bir satışçı diğerine atar.

USE AdventureWorks2012;
UPDATE TOP (10) Sales.Store
SET SalesPersonID = 276
WHERE SalesPersonID = 275;
GO

EN anlamlı bir kronolojisi güncelleştirmeleri uygulamak için kullanmak zorunda kalırsanız, subselect deyimi içinde top sipariş ile birlikte kullanmanız gerekir. Aşağıdaki örnek, en erken işe alınma tarihleri için tatil saatleri 10 çalışanların güncelleştirir.

UPDATE HumanResources.Employee
SET VacationHours = VacationHours + 8
FROM (SELECT TOP 10 BusinessEntityID FROM HumanResources.Employee
     ORDER BY HireDate ASC) AS th
WHERE HumanResources.Employee.BusinessEntityID = th.BusinessEntityID;
GO

Ayrıca bkz.

Başvuru

select (Transact-sql)

Insert (Transact-sql)

Güncelleştirme (Transact-sql)

Sil (Transact-sql)

order by yan tümcesi (Transact-sql)

set rowcount (Transact-sql)

BİRLEŞTİRME (Transact-sql)