2011-08-25 70 views
2

我想在每一個獨特的(columnA,columnB)元組大部分一條記錄在我下面的delete語句刪除:至多有一個記錄刪除每個元組的獨特組合

DELETE FROM tableA 
WHERE columnA IN 
    (
    --some subqueryA 
    ) 
AND columnB IN 
    (
    --some subqueryB 
    ) 

這是如何實現的呢?請僅考慮那些在針對MSS 2000(即T-SQL 2000語法)時使用的語句。我可以通過迭代一個臨時表來完成,但我只想使用集合來編寫它。

實施例:

subqueryA returns 1 
subqueryB returns 2,3 

如果原始表包含 (columnA,columnB,columnC)

5,2,5 
1,2,34 
1,2,45 
1,3,86 

然後

1,2,34 
1,3,86 

應予刪除。每個唯一的(columnA,columnB)-tuple在tableA中最多出現兩次,每次運行我的SQL語句時,我最多隻想刪除這些獨特組合之一 - 從來沒有兩個。

如果有一個給定唯一的(columnA,columnB)元組的一個記錄, 刪除。

如果有兩個記錄,一個給定的唯一(columnA, columnB)元組,只刪除其中之一。

Delete tabA 
from TableA tabA 
Where tabA.columnC in (
     select max(tabAA.columnC) from TableA tabAA 
     where tabAA.columnA in (1) 
     and tabAA.columnB in (2,3) 
     group by tabAA.columnA,tabAA.columnB 
) 
+2

桌子上有鑰匙嗎? –

+0

PK是columnA,columnB和columnC(columnC是出票列)。 – ppecher

+0

您可以顯示一些示例行並確定要刪除哪些行,以及如何確定要保留哪些行? –

回答

1

你多久會運行一次這樣,不管你使用臨時表還是不重要?也許你應該考慮給表添加約束,所以你只需要這樣做一次......

這就是說,在所有誠實中,爲SQL Server 2000做到這一點的最佳方法可能是使用#temp表作爲你已經在做。如果你想刪除所有但每個受騙者之一,那麼你可以這樣做:

  • 插入不同的行到一個單獨的表
  • 從舊錶中刪除所有行
  • 招不同的行回到原來的表

我也做過像不同的行復制到一個新的表,刪除舊的表,並重命名新的表。

但是,這聽起來不像的目標。你可以用#temp表格顯示你當前使用的代碼嗎?我試圖設想如何識別要保留的行,並且可能看到現有的代碼會觸發某些內容。

編輯 - 現在有了更好的理解要求,我可以提出以下查詢。請先在表格的副本上進行測試!

DELETE a 
FROM dbo.TableA AS a 
INNER JOIN 
(
    SELECT columnA, columnB, columnC = MIN(columnC) 
     FROM dbo.TableA 
     WHERE columnA IN 
     (
     -- some subqueryA 
     SELECT 1 
    ) 
     AND columnB IN 
     (
     -- some subqueryB 
     SELECT 2 UNION SELECT 3 
    ) 
     GROUP BY columnA, columnB 
) AS x 
ON a.columnA = x.columnA 
AND a.columnB = x.columnB 
AND a.columnC = x.columnC; 

請注意,這並不確認是否只有一行或兩行匹配columnA和columnB上的分組。另請注意,如果您運行這兩次,它將刪除仍然匹配子查詢的剩餘行!

+0

我打算這麼做。它是由一個web應用程序觸發的。我還沒有寫出可試用的邏輯,我試圖找到更有效的方法。 – ppecher

+0

我在寫這篇文章時設計了我的陳述:D我把它附加到我的文章的末尾。我能夠利用收費列。儘管非常感謝你的努力!編輯:其實你在做什麼基本上是我在做什麼。只有你使用min ... – ppecher

+1

我不認爲你的版本的查詢會起作用,除非'columnC'上也有獨立的唯一約束。例如,在您的示例輸出中將'5,2,5'更改爲'5,2,45'。哎呀!您刪除了一行太多,因爲您沒有將「columnC」與任何其他列相關聯。如果'columnC'是唯一的,那麼別介意。 –

相關問題