我有以下表格:
project(pid integer primary key, title varchar(30), finished boolean)
action(aid integer primary key, title varchar(30), finished boolean)
project_action(pid integer, aid integer, primary key(pid, aid))
一个项目可以包含多个动作,一个动作只能属于一个或一个项目。因此,基数为(项目)0..1 <-> *(动作)。
我如何才能获得行动已全部完成的项目?
我尝试了这个,但是只要完成其中一项操作,就已经给了我一个项目:
SELECT pid FROM project WHERE pid IN (SELECT DISTINCT pid FROM project_action WHERE aid IN (SELECT aid FROM action WHERE action.finished = true));
尽管对于表内容的意图有些不清楚,但我认为您的结构可能会有些偏离。让我举一个简单的汽车维修示例(我绝对不是车身修理工)。
Project, Repair Person "A" car.
Pre-clean
Pull dent / repair parts
Apply any filler
Sand it
Paint
如果“动作”在多个项目中保持一致,则该表将没有“完成”布尔值标志。该标志将特定于正在处理的一个项目。如果我有10辆车,那么在不同阶段的某个地方,我可以完全完成3辆赛车,而在其他地方完成7辆赛车。所以,也就是说,我期望的结构更像
project(pid integer primary key, title varchar(30), finished boolean)
action(aid integer title varchar(30))
project_action(pid integer, aid integer, finished boolean, primary key(pid, aid))
说了这么多,并保持原始结构不变,您可以拥有一个示例,其中需要在该示例上执行2,3或更多操作。如果ANY操作不完整,则整个项目都不完整。我还将在您的“操作”表上基于(pid,辅助,完成)的索引
然后做一个NOT EXISTS的完成=假
SELECT
p.pid,
p.title
from
project p
where
NOT EXISTS ( select pa.pid
from project_action pa
join action a on pa.aid = a.aid
AND a.finished = false
where pa.pid = p.pid )
这基本上是在说明……给我所有项目,无论当前项目是什么,都没有针对该项目的“ FALSE”完成动作。只要找到符合条件的记录,EXISTS(或NOT EXISTS)就会停止。因此,如果您对一个项目有10项未完成的工作,则一旦找到ONE,就用合格的WHERE完成该操作,并接受或拒绝该项目记录,然后转到下一个项目。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句