2009-07-24 36 views
6

Tôi cần xây dựng một câu lệnh SQL để xóa khỏi bảng nhất định các bản ghi khớp với một câu lệnh chọn khác.Máy chủ Sql DELETE và WITH khoản

Trong Teradata chúng tôi sử dụng

delete from table1 
where (col1, col2) in (
    select col1,col2 
    from table2 
) 

Trong thời gian ở SQL Server nó không được phép có nhiều hơn 1 cột trong mệnh đề WHERE..IN. Tôi nghĩ tôi có thể sử dụng mệnh đề WITH:

with tempTable(col1,col2) as (
select col1,col2 
from table2 
) 
delete from table1 
where table1.col1 = tempTable.col1 
and table1.col2 = tempTable.col2 

Cách sử dụng mệnh đề WITH..DELETE? Có cách nào khác không?

Trả lời

19

này nên làm điều đó:

DELETE Table1 
from Table1 t1 
    inner join tempTable t2 
    on t2.Col1 = t1.Col1 
    and t2.Col2 = t1.Col2 
+1

... bạn có thể sử dụng WITH mệnh đề, nhưng cách này đơn giản hơn. –

+0

cảm ơn nó đã hoạt động! nhưng làm thế nào để sử dụng WITH..DELETE? – ala

+0

Suy nghĩ về nó, tôi thấy không có lý do gì để sử dụng mệnh đề WITH. Tôi sử dụng WITH khi mọi thứ trở nên lộn xộn hoặc phức tạp một cách nghiêm trọng và việc xóa khỏi bảng dựa trên việc tham gia đơn giản vào một bảng khác không đủ phức tạp để đảm bảo nỗ lực mã hóa bổ sung. –

1
delete from table1 t1 where exists 
    ( 

    select 1 from table2 t2 where t1.col1 = t2.col1 and t1.col2 > t2.col2 

) 
+1

cú pháp này là không chính xác –

+1

cú pháp là không đúng, nhưng ý tưởng chung là đúng. SQL Server có thể tối ưu hóa điều này vì vậy nó nên thực hiện cũng như một giải pháp bằng cách sử dụng một tham gia trong khi được dễ dàng hơn để đọc IMO. – EvilRyry

4

đầu tiên xây dựng một truy vấn mà chọn hàng bạn cần:

SELECT t1.* 
FROM [Table1] t1 
INNER JOIN [Table2] t2 ON t1.[col1] = t2.[col1] AND t1.[Col2]=t2.[Col2] 

thử nghiệm nó để đảm bảo nó sẽ trả về chính xác các hàng bạn muốn xóa. Sau đó, biến nó thành một tuyên bố xóa bằng cách thay đổi "SELECT" thành "DELETE" và loại bỏ danh sách cột:

DELETE t1 
FROM [Table1] t1 
INNER JOIN [Table2] t2 ON t1.[col1] = t2.[col1] AND t1.[Col 
+0

Đó là lời khuyên tốt trong SSMS, nhưng không thực tế lắm ... – RolandTumble

+1

+1 để đo hai lần và cắt một lần – 2Toad

0
with tempTable(col1,col2) as (
    select col1,col2 
    from table2 
) 
delete table1 from tempTable 
where table1.col1 = tempTable.col1 
and table1.col2 = tempTable.col2 
+1

Tốt hơn nên đưa ra một số giải thích thay vì chỉ có câu trả lời bằng mã. độc giả. – EJoshuaS

+0

Chào mừng bạn đến với Stack Overflow! Mặc dù đoạn mã này có thể giải quyết được sự cố, nhưng nó không giải thích tại sao hoặc cách nó trả lời câu hỏi. Vui lòng [đưa ra giải thích cho mã của bạn] (// meta.stackexchange.com/q/114762/269535), vì điều đó thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho người đọc trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn. ** Cờ/người đánh giá: ** [Đối với các câu trả lời chỉ có mã như câu trả lời này, ghi chú, đừng xóa!] (// meta.stackoverflow.com/a/260413/2747593) –

0

này làm việc cho tôi

WITH CTE AS 
(
SELECT TOP 50000 * 
from v020101hist order by data 
) 
DELETE FROM CTE 
Các vấn đề liên quan