MsAccess按条件

时间:2017-08-23 02:01:28

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

我在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, "") 

我的逻辑很简单,如果FollowDept和Department重合,则ID的ActualArea从FollowingDept获取值。

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

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

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

1 个答案:

答案 0 :(得分:0)

您需要另一个表,其中包含actualArea的可能值和优先级作为数字,然后您可以选择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子句消除了actualArea为空的所有行。 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不是唯一的,那么我们需要重温这个答案。这个答案还假设您已经拥有了身份证号码。