2009-11-12 102 views
0

我有一張包含銷售訂單數據(訂單號,產品編號,銷售價格等)的表格。如何刪除匹配行對?

但是,表格中亂七八糟的是更正和各種其他無效數據。其中一個主要問題是修正是通過添加一個等於先前訂單金額的負數總和來輸入的。銷售人員並不總是透徹,經常給出新的訂單號,或者甚至沒有在更正中列出產品編號。

我想刪除總數爲負的所有行以及它們的匹配(或任何其他具有相同總數的)正整行。

我的第一個想法是簡單地刪除所有負面的總行和任何具有相反總數的正面行。但是,由於許多負面訂單存在多個正面訂單,這導致大量錯誤地刪除正面訂單。

我該如何刪除總數爲負的所有行,以及一個行對於每個具有反向總數的行?

回答

1

取決於有多少數據,我只是用蠻力的方式來做。

選擇所有的負總行到一個臨時表

使用光標要經過的每一行,然後查詢單個匹配的數據庫(使用也許MAX()上的時間戳,順序號,或任何主鍵,你可能有。刪除一個「匹配」行。

然後刪除所有的負面行

毫無疑問,你可以使用子查詢,並做到在一個聲明,但到時候我想通了並測試它,我會使用上面的工作:)

0

什麼是鏈接2行的共享標識符?沒有這一點,你不能因爲你沒有什麼

反正聯接行

,它會像

DELETE MyTable 
WHERE EXISTS (
    SELECT * FROM MyTable M2 
    GROUP BY M2.LinkID 
    HAVING SUM(M2.ValueCol) < 0 AND MyTable.KeyCol = M2.KeyCol 
    ) 
0

我跑內部SELECT,沒有包裝刪除一次,一看就知道了數據看起來不錯,但我敢肯定,這很好

DELETE FROM 
    orders 
WHERE 
    orderID IN (
     SELECT 
      orderID 
     FROM (
      SELECT 
      MIN(orderID) orderID, total 
      FROM 
      orders 
      WHERE 
      total IN (
       SELECT 
        total * -1 
       FROM 
        orders 
       WHERE 
        total < 0 
      ) 
      GROUP BY 
      total 
    )derived 
    ) 

DELETE FROM 
    orders 
WHERE 
    total < 0 
1

數據清理任務是痛苦的,不管是什麼。從你所描述的,沒有足夠的信息來完全自動化這項任務。這是數據清理的典型情況。

首先,您需要與您的直屬經理談一談,並讓他知道問題的嚴重程度。這不是你的錯,數據全部搞砸了,需要時間來修復它,而不會丟失任何有效信息,也不會中斷銷售操作。

關於數據清理的最重要的提示是它的比嘗試完全自動化更值得的麻煩。您的策略應該是通過照顧簡單案例來減少問題,直到您可以手動完成其餘部分。總會有複雜的邊緣情況,並試圖用聰明的SQL來處理它們,這是一個收益遞減的練習。

  1. 照顧低掛水果,其中負「校正」有一個有效的訂單號碼,這樣就可以使它的目的是取消訂單很強的相關性。

  2. 創建剩下的底片和相同數量的最近單筆訂單行之間的相關性。如果可以,請使用其他列關聯它們,例如,如果由輸入原始訂單的相同銷售人員輸入更正。

  3. 下一階段將刪除底片,其中訂單號是有效的,但是它映射到總結的總價值多行。

  4. 然後在沒有訂單號碼到總結在修正值的多個行匹配底片啓動。這可能會非常棘手自動化,但是在這個時候底片的數量可能很少,以至於你可以做手工,通過一個目測它們之一。

另一個提示是SQL Anywhere似乎有一個多表DELETE語法。我不使用SQL Anywhere中,但我發現這個在在線文檔:

Syntax 

DELETE [ row-limitation ] 
    [ FROM ] [ owner.]table-expression 
    [ FROM table-list [,...] ] 
    [ WHERE search-condition ] 
    [ ORDER BY { expression | integer } [ ASC | DESC ], ... ] 
    [ OPTION(query-hint, ...) ] 

它看起來像第一FROM子句列出你想刪除行的表第二FROM子句允許你做加盟出於限制行的目的。因爲你很可能會做自聯接,記住,你需要在第一FROM給一個別名(又名相關的名稱),以避免歧義。