【问题标题】:MsAccess Delete all values but one in column by conditionMsAccess 按条件删除除一列之外的所有值
【发布时间】:2017-08-23 02:01:27
【问题描述】:

我在 MS ACCESS 2013 中有一个如下所示的表:

    Id        Department        Status           FollowingDept         ActualArea
  1000         Thinkerers       Thinking          Thinkerer             Thinkerer      
  1000         Drawers          OnDrawBoard       Drawers               Drawers
  1000         MaterialPlan     To Plan           MaterialPlan        MaterialPlan  
  1000         Painters         MatNeeded         MaterialPlan        
  1000         Builders         DrawsNeeded       Drawers             

该表给出了一个 ID,该 ID 必须通过五个部门,每个部门至少有 5 个不同的状态。

每个状态都有一个 FollowDept 值,例如 *Department* Thinkerers 具有状态 MoreCoffeeNow,这意味着 *FollowingDept* Drawers

除 ActualArea 之外的所有列都是从查询提要中获取值的列。

ActualArea 是一个 Expr,我在其中插入了这个逻辑:

Iif(FollowingDept = Department, FollowingDept, "") 

我的逻辑很简单,如果FollowingDept和Department一致,那么ID的ActualArea就从FollowingDept获取值。

但正如您所见,在极少数情况下,ID 就像我上面的示例一样,其中 3 个部门与 FollowDept 重合。这种情况很少见,但我想在 Access 中添加优先级。

Thinkerers 具有最高优先级,然后是 MaterialPlan,然后是 Drawers,然后是 Builders,最后是 Painters。因此,按照相同的示例,在 ActualArea 获得 3 个值之后,Access 将执行另一个查询或子查询或其他任何内容,它将评估每个值的优先级,并且只留下具有最​​高优先级的那个。所以在本例中,Thinkerers 获得最高优先级,而其他两个值从 ActualArea 列中消除。

请记住,有超过 500 个不同的 ID,每个 id 重复 5 次,因此要评估的总记录将是 2500。

【问题讨论】:

    标签: subquery ms-access-2013 ms-access-2016


    【解决方案1】:

    您需要另一个表,其中实际区域的可能值和优先级为数字,然后您可以使用 JOIN 进行选择并按优先级排序:

    SELECT TOP 1 d.*, p.priority 
    FROM departments d
    LEFT JOIN priorities p ON d.actualArea = p.dept
    WHERE d.id = 1000
    AND p.priority IS NOT NULL
    ORDER BY p.priority ASC
    

    IS NOT NULL 子句消除了所有实际区域为空的行。 TOP 条件只留下最高优先级的行。

    您的表似乎没有主键。如果您不这样做,那么我会在一分钟内提供另一个查询,但我会强烈建议您返回并在表中添加一个主键。它会在以后为您节省大量的头痛。我确实在我的测试表中添加了这样一个键,它被称为 pID。此查询使用该 pID 来删除您需要的记录:

    DELETE FROM departments WHERE pID NOT IN (
    
       SELECT TOP 1 d.pID
       FROM departments d
       LEFT JOIN priorities p ON d.actualArea = p.dept
       WHERE id = 1000
       AND p.priority IS NOT NULL
       ORDER BY p.priority ASC
    
    )
    

    如果你不能给数据添加主键并且actualArea被假定是唯一的,那么你可以只使用actualArea值来执行删除:

    DELETE FROM departments WHERE actualArea NOT IN (
    
       SELECT TOP 1 d.actualArea
       FROM departments d
       LEFT JOIN priorities p ON d.actualArea = p.dept
       WHERE id = 1000
       AND p.priority IS NOT NULL
       ORDER BY p.priority ASC
    
    ) AND id = 1000
    

    如果 actualArea 不是唯一的,那么我们需要重新审视这个答案。此答案还假设您已经拥有身份证号。

    【讨论】:

    • 谢谢,我会按照你说的添加一个新表,看看情况如何。实际上,假设一切顺利,我将提取 ActualArea 中有值的每个 ID。就像我说的,有 500 个唯一 ID,每个重复 5 次,在获得正确的 ActualArea 后,我将提取该记录,因此我应该以另一个具有 500 个唯一 ID 的表结束。谢谢你的回答,
    • 如果您想在一个查询中完成所有操作,这也是可能的。如果原始查询符合您的要求,我可以向您展示如何做到这一点。
    猜你喜欢
    • 2022-01-16
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 2013-10-04
    • 2019-06-09
    • 2012-11-23
    相关资源
    最近更新 更多