2009-11-12 62 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给一个别名(又名相关的名称),以避免歧义。