我在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.
答案 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不是唯一的,那么我们需要重温这个答案。这个答案还假设您已经拥有了身份证号码。