2014-02-26 44 views
0

我嘗試使用下面的查詢如何使用內部聯接刪除頂部(N)行?

Delete top(3) ss 
from stage.SubmitItemData ss 
INNER JOIN stage.SubmitItems s (NOLOCK) on ss.SubmitItemId = s.SubmitItemId 
where s.AgencyCode = 'NC0860000' and s.StatusId = 8 

凡我難倒是刪除兩個表中的幾行,如果我刪除了參數s.AgencyCodes.StatusId查詢沒有問題執行。但是,如果我添加這些參數,我得到的(0) rows affected.

我想要做的就是控制在任何給定時間刪除的記錄數。頂(n)不是最好的方法,因爲它看起來好像它需要訂購工作?爲這種類型的刪除創建一個循環會更好嗎?

感謝您的任何建議。

+2

做,如果你將其更改爲你得到任何行'select'?你真的有行匹配嗎? – Blorgbeard

+0

是的,如果我刪除機構代碼和狀態刪除工作(與匹配的數據)的參數在表中返回表中的數據 – rlcrews

+0

如果*不*刪除參數是否有數據返回一個選擇? – Blorgbeard

回答

2
DELETE TOP (3) 
FROM stage.SubmitItemData 
WHERE 
     EXISTS (SELECT 1 
       FROM stage.SubmitItems 
       WHERE SubmitItemId = SubmitItemData.SubmitItemId 
       AND AgencyCode = 'NC0860000' 
       AND StatusId = 8) 

或者你可以做這樣的事情......

DELETE TOP(3) FROM ss 
FROM stage.SubmitItemData ss 
INNER JOIN stage.SubmitItems s WITH (NOLOCK) 
ON ss.SubmitItemId = s.SubmitItemId 
where s.AgencyCode = 'NC0860000' and s.StatusId = 8 
+0

這兩個查詢都不起作用。兩者都在select(51396)中返回相同的行數,刪除前後使用delete語句本身返回0行受影響 – rlcrews

+0

@rlcrews查詢無誤100%,這意味着沒有滿足條件的行。只需做一個簡單的選擇而不是刪除,看看它是否返回任何行。 –

0

試試這個

DELETE FROM stage.SubmitItemData 
WHERE SubmitItemId IN 
(SELECT TOP 3 SubmitItemId 
from stage.SubmitItemData ss 
INNER JOIN stage.SubmitItems s (NOLOCK) on ss.SubmitItemId = s.SubmitItemId 
and s.AgencyCode = 'NC0860000' 
and s.StatusId = 8 
order by ASC); 
+0

沒有解析錯誤,但是沒有記錄被刪除的結果相同 – rlcrews

+0

首先嚐試選擇前3行。我認爲沒有行存在這種情況。 StatusId列的類型是什麼? –

+0

select語句正常返回數據。沒有TOP(N)的刪除語句可以正常工作,但是我需要控制被刪除的數字或記錄。我假設一個TOP(N)的方法是這樣做的正確方法 – rlcrews

1
;WITH cte 
AS 
(
    select *, Row_number() over (order by s.SubmitItemId) As Rno 
    from stage.SubmitItemData ss 
    INNER JOIN stage.SubmitItems s (NOLOCK) on ss.SubmitItemId = s.SubmitItemId 
    where s.AgencyCode = 'NC0860000' and s.StatusId = 8 
) 
DELETE FROM cte where Rno <=3 
+0

在當前數據庫中,當使用相同標準運行選擇計數(*)語句時,此表可以返回從幾千行到超過1000萬的行數 – rlcrews