88

Tôi có một bảng trong SQL Server. Tôi muốn xóa 1000 hàng đầu khỏi nó. Tuy nhiên, tôi đã thử điều này, nhưng tôi thay vì chỉ xóa 1000 hàng trên cùng, nó đã xóa tất cả các hàng trong bảng.

Đây là mã:

delete from [mytab] 
select top 1000 
a1,a2,a3
from [mytab]
|
  • 7

    Bạn cần ĐẶT HÀNG B toNG để làm cho TOP có ý nghĩa: xem câu trả lời của @Martin Smith, đây là câu hỏi duy nhất trong số năm câu hỏi này. Đôi khi tôi tuyệt vọng

    – Hồ Bạch Liên 20:24:54 21/01/2012
  • 2

    Bạn có muốn xóa bất kỳ 1000 hàng? Chỉ cần chọn ngẫu nhiên? Hoặc, ví dụ, 1000 hàng cũ nhất hàng đầu?

    – Ngô Lệ Chi 20:55:01 21/01/2012
  • 13

    Bạn đã xóa tất cả các bảng vì delete from [mytab]là một câu lệnh và select top ...một câu lệnh khác.

    – Lê Huy Quang 21:11:14 21/01/2012
  • 2

    Bạn không cần đặt hàng đầu, phụ thuộc vào lý do tại sao bạn làm TOP. Nếu bạn cần xóa 10 triệu hàng và có sẵn 1 GB không gian nhật ký, hãy sử dụng Xóa TOP (10000) Từ dbo.myTable (với mệnh đề chọn của bạn) và tiếp tục chạy cho đến khi không còn hàng nào để xóa. Ai quan tâm nếu nó tùy tiện. Sắp xếp chỉ làm chậm truy vấn.

    – Đặng Hà An 16:04:16 06/06/2016
  • 1

    Tôi nhận ra rằng đây là một câu hỏi cổ xưa (trong những năm SO) nhưng tôi nghĩ rằng điều quan trọng là mọi người phải xem xét các bình luận của @gbn . Mặc dù ý kiến ​​của anh ấy không áp dụng cho tình huống đã cho của tôi (cố gắng xóa các khối hồ sơ mà không gây ra sự cố LOCK nhưng không thực sự quan tâm đến thứ tự bị xóa), rất có thể chúng sẽ áp dụng cho tình huống CỦA BẠN. Hãy chắc chắn rằng bạn xem xét chúng trước khi sử dụng một cách mù quáng các câu trả lời dưới đây không bao gồm mệnh đề ORDER BY.

    – Huy Duy 15:45:17 22/08/2016
175

Mã bạn đã thử thực tế là hai câu lệnh. A DELETEtheo sau là a SELECT.

Bạn không định nghĩa TOPnhư được sắp xếp bởi những gì.

Đối với một tiêu chí đặt hàng cụ thể xóa khỏi CTE hoặc biểu thức bảng tương tự là cách hiệu quả nhất.

;WITH CTE AS
(
SELECT TOP 1000 *
FROM [mytab]
ORDER BY a1
)
DELETE FROM CTE
|
74

Có thể tốt hơn cho sql2005 + để sử dụng:

DELETE TOP (1000)
FROM [MyTab]
WHERE YourConditions

Đối với Sql2000:

DELETE FROM [MyTab]
WHERE YourIdField IN 
(
  SELECT TOP 1000 
    YourIdField 
  FROM [MyTab]
  WHERE YourConditions
)

NHƯNG

Nếu bạn muốn xóa tập hợp con cụ thể của các hàng thay vì tập hợp con tùy ý, bạn nên xác định rõ thứ tự để truy vấn con:

DELETE FROM [MyTab]
WHERE YourIdField IN 
(
  SELECT TOP 1000 
    YourIdField 
  FROM [MyTab]
  WHERE YourConditions
  ORDER BY ExplicitSortOrder
)

Cảm ơn tp @gbn đã đề cập và yêu cầu câu trả lời rõ ràng và chính xác hơn.

|
  • 1

    @gbn Có thể vô dụng đối với bạn, nhưng vẫn chính xác đó là những gì câu hỏi đang yêu cầu.

    – Võ Huy Tuấn 20:28:07 21/01/2012
  • 1

    @Joachim Isaksson: đi và đọc về TOP sau đó quay lại. Không có thứ gọi là TOP mà không có thứ tự theo bộ. Ngoài ra, đi và tìm cho tôi một tài liệu tham khảo kinh điển để chứng minh tôi sai ... Để giúp bạn tiết kiệm tìm kiếm, sqlblog.com/blogs/alexander_kuznetsov/archive/2009/05/20/...blogs.technet.com/b/wardpond/archive / 2007/07/19 / Ngày

    – Hoàng Hồng Oanh 20:30:00 21/01/2012
  • 1

    @gbn Không có bất kỳ điều kiện nào về việc xóa hàng nào, vì vậy ĐẶT HÀNG B inNG trong truy vấn con là vô ích

    – Đặng Khánh Hội 07:43:31 22/01/2012
  • 1

    @gbn Bạn có đề cập WHERE trong truy vấn con - Tôi lọc 1000 hàng tùy ý bên trong các tiêu chí được chọn và xóa sau đó. Kịch bản hợp lệ? Vâng. Nếu tôi thêm ĐẶT HÀNG THEO NEWID () hoặc bất cứ điều gì nó không thay đổi - tôi vẫn xóa 1000 hàng được lọc theo tiêu chí được chọn

    – Đỗ Lam Bích 08:11:46 22/01/2012
  • 1

    @gbn Trong trường hợp bạn đang tìm kiếm cách sử dụng TOP hợp lệ mà không cần ĐẶT HÀNG: điều tôi mang đến đây là tôi cần xóa tất cả các hàng phù hợp với một số tiêu chí, nhưng vì lý do hiệu suất, tôi không muốn nó xóa hơn 10.000 hàng tại một thời điểm. Tôi không quan tâm nó sẽ xóa những hàng nào, vì tôi sẽ chạy lại lệnh trong một khoảng thời gian cho đến khi tất cả các hàng như vậy biến mất.

    – Tạ Khánh Huyền 16:09:13 13/10/2014
24

Như được định nghĩa trong liên kết dưới đây, bạn có thể xóa theo cách thẳng tiến

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

http://technet.microsoft.com/en-us/l Library / ms175486 (v = sql.105) .aspx

|
6
delete from [mytab]
where [mytab].primarykeyid in
(
select top 1000 primarykeyid
from [mytab]
)
|
  • 1

    Vô dụng: TOP mà không cần ĐẶT HÀNG B BYNG cho các hàng tùy ý

    – Tạ Ánh Nguyệt 20:22:54 21/01/2012
  • 1

    @gbn Có thể vô dụng đối với bạn, nhưng vẫn chính xác đó là những gì câu hỏi đang yêu cầu.

    – Lý Anh Khôi 20:26:32 21/01/2012
  • 1

    @gbn Tôi không khẳng định rằng có bất kỳ thứ tự sắp xếp mặc định nào hoặc truy vấn đó thậm chí còn hữu ích, tôi chỉ nhắc bạn rằng câu hỏi không yêu cầu một câu hỏi vậy bạn sẽ đề nghị đặt hàng trên cái gì?

    – Luyen Ngo 20:40:10 21/01/2012
  • 1

    @gbn Tôi không biết tại sao bạn lại thù địch với mọi người về điều gì đó là điểm khởi đầu. Tôi không khẳng định rằng câu trả lời của tôi là kết thúc tất cả, nó chỉ là một gợi ý để giúp đỡ ai đó. Tôi nghĩ tầm quan trọng là các khóa đang quay trở lại từ truy vấn phụ ở đây.

    – Trịnh Ngọc Thái 21:01:15 21/01/2012
  • 1

    Đây có thể là tất cả những gì người hỏi đang tìm kiếm. Tôi chỉ cần thêm một ghi chú cho người khác đọc để nhấn mạnh rằng các hàng bị xóa bởi một tuyên bố như vậy không được đảm bảo theo bất kỳ thứ tự nào.

    – Dương Mai Trinh 21:14:10 21/01/2012
2

Nó nhanh. Thử nó:

DELETE FROM YourTABLE
FROM (SELECT TOP XX PK FROM YourTABLE) tbl
WHERE YourTABLE.PK = tbl.PK

Thay thế YourTABLEbằng tên bảng, XXbằng một số, ví dụ 1000, pklà tên của trường khóa chính của bảng của bạn.

|
  • 1

    Bạn đang tạo hiệu quả hai bảng từ một, và sau đó xóa nơi đã tham gia. Nó hoạt động tốt khi bạn muốn xóa các bản ghi cũ nhất (hoặc mới nhất) khỏi bảng, vì bạn có thể sắp xếp chúng tăng dần trước. T-sql này được chấp nhận bởi Microsoft (và nó nhanh).

    – Tạ Ánh Nguyệt 18:37:21 21/01/2016
1
SET ROWCOUNT 1000;

DELETE FROM [MyTable] WHERE .....
|
  • 1

    Khi giao dịch chỉ với 1000 hàng, nó có thực sự quan trọng không ?? Nếu là 100.000.000 hàng thì điểm của bạn có thể hợp lệ, nhưng chỉ với 1000 hàng, đây là giải pháp đơn giản nhất được đề xuất cho đến nay cho SQL 2008

    – Tạ Ánh Nguyệt 09:46:42 17/03/2014

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.