2009-04-30 33 views
8

Tôi đang cố xoá tất cả trừ 3.000 mục gần đây nhất trong một bảng. Bảng có 105.000 hồ sơ.SQl Xóa top 100 khỏi bảng

Tôi đang thử điều này, nhưng lỗi được tạo không đúng cú pháp.

delete tRealtyTrac where creation in(select top 103000 from tRealtyTrac order by creation) 
+4

Chẳng phải bất cứ ai khác thông báo rằng 105.000 trừ 103.000 = 2.000? Anh ấy nói "Tôi đang cố gắng xóa tất cả nhưng 3.000 mục gần đây nhất trong một bảng." Anh ta sắp xóa 1000 hồ sơ nhiều hơn anh ta muốn. –

Trả lời

18

Cú pháp xóa sẽ hơi khác so với những gì bạn có. Một ví dụ sẽ là:

DELETE FROM tRealtyTrac 
WHERE creation in(select top 103000 creation from tRealtyTrac order by creation) 

Lưu ý cách có từ khóa "từ". Này được nói rằng chúng tôi muốn xóa từ bảng gọi tRealtyTrac

Một vấn đề tôi thấy trước với điều này là, bạn có lẽ sẽ muốn không sử dụng sự sáng tạo ...

Thay vào đó:

DELETE FROM tRealtyTrac 
WHERE someuniqueidcolumnlikeakeyofsomesort in(select top 103000 someuniqueidcolumnlikeakeyofsomesort from tRealtyTrac order by creation) 

Nếu không, bạn có thể xóa nhiều hơn bạn dự định.

+0

Quá trình tạo có thể giống nhau trong thành viên 103001 và 103000. Tôi muốn chọn PK ID trên cùng và kiểm tra trong đó. – Eric

+0

thanks guys- Tôi sử dụng lệnh này kết hợp các câu trả lời của bạn xóa tRealtyTrac trong đó id in (chọn top 103000 id từ thứ tự tRealtyTrac bằng cách tạo) – Bryan

4

Truy vấn nội cần phải được:

chọn top 103.000 tạo từ ...

+0

Điều này là chính xác. Cảm ơn bạn. Đánh dấu câu trả lời của Brian là chính xác vì cú pháp đầy đủ và giải thích được cung cấp. – Bryan

2

Một cách siêu dễ dàng để làm điều này:

  1. chọn top 3001 từ đơn hàng tRealtyTrac theo sáng tạo desc

  2. lấy ngày cuối cùng của sau đó xóa tRealtyTrac nơi tạo < 'thedateyoufound'

Nhưng Andy có một ý tưởng tốt quá. ;)

+0

Ý tưởng hay :) Điều đó cũng hoạt động. – Bryan

1

Hãy thử điều này:

DELETE FROM tRealtyTrac WHERE creation IN (SELECT top 103000 * FROM tRealtyTrac ORDER by creation) 

Bạn quên các trường trong tRealtyTrac (Tôi đã sử dụng một dấu hoa thị để chọn tất cả nhưng bạn có thể làm cho một danh sách trong số họ hoặc chỉ có một). Bạn cũng quên mệnh đề FROM.

+0

câu lệnh của bạn không thành công vì không thể IN tất cả các thuộc tính của tRealtyTrac. Mặc dù, bạn đã đề cập rằng người ta phải thay đổi dấu hoa thị, câu lệnh đưa ra kiến ​​thức sai cho người đọc. – Tim

3

Đối với tôi, CTE sự là giải pháp tốt hơn cho yêu cầu xóa

;WITH records_delete AS (
    select top 103000 creation 
    from tRealtyTrac 
    order by creation) 
DELETE records_delete 
Các vấn đề liên quan