我有以下表格:
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))
项目可以包含多个操作,一个操作只能属于none或一个项目。因此,cardinatlity是(项目)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));
答案 0 :(得分:1)
虽然您对表格内容的意图有点不清楚,但我认为您的结构可能有点偏差。让我举一个汽车维修的简单例子(我绝不是一个汽车车身人员)。
Project, Repair Person "A" car.
Pre-clean
Pull dent / repair parts
Apply any filler
Sand it
Paint
如果“Actions”在多个项目中保持一致,那么该表将没有“已完成”的布尔标志。该标志将特定于正在处理的一个项目。如果我有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或更多动作。如果任何操作不完整,则整个项目不完整。我还会根据(pid,aid,finished)
在你的“Action”表上有一个索引然后做一个NOT EXISTS of finished = false
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件事情不完整,那么一旦找到一件事,就会通过合格的WHERE来完成,接受或拒绝项目记录并转到下一个项目。
答案 1 :(得分:0)
我会加入表格:
import Foundation
import StoreKit
class ProductDataModel: NSObject, NSCoding {
var product = SKProduct()
// MARK: - var and let
private let coderKey = "ProductDataModel"
override init() {
super.init()
}
convenience init(product: SKProduct) {
self.init()
self.product = product
}
required init?(coder aDecoder: NSCoder) {
self.product = aDecoder.decodeObjectForKey(coderKey) as! SKProduct
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(self.product, forKey: coderKey)
}
}
答案 2 :(得分:0)
尝试仅选择没有未完成操作的项目。您应该记住,这种方法将为您提供没有任何操作的项目。
SELECT pid FROM project WHERE pid NOT IN
(SELECT DISTINCT pid FROM project_action WHERE aid IN
(SELECT aid FROM action WHERE action.finished = false)
);
答案 3 :(得分:0)
试试这个 -
SELECT project.pid FROM project
LEFT JOIN project_action ON project_action.pid = project.pid
LEFT JOIN action ON project_action.aid = action.aid
WHERE action.finished = true
答案 4 :(得分:0)
SELECT p.pid FROM project p WHERE p.pid NOT IN
(SELECT pa.pid FROM project_action pa
JOIN action a ON pa.aid = a.aid
WHERE a.finished = FALSE)