我有这个表的架构。
Machine(machine_id, size)
Operator(operator_id, name)
OperationLog(machine_id, operator_id, date, comment)
machine_id: FK(Machine)
operator_id: FK(Operator)
假设我想查询只给出操作所有尺寸大于 5m2 的机器的操作员的名称。
使用 ALL 运算符是否会给我想要的结果?也就是说,在尺寸大于 5 的机器列表中,有日志的操作员必须匹配所有这些机器。
SELECT O.name
FROM Operator O NATURAL JOIN OperationLog L
WHERE L.machine_id = ALL (
SELECT M.machine_id
FROM Machine M
WHERE size >5);
或者我需要像这样进行“双重否定”吗?该怎么办?
SELECT O.name
FROM Operator O
WHERE NOT EXISTS(
SELECT M.machine_id
FROM Machine M
EXCEPT
SELECT L.machine_id
FROM OperationLog L NATURAL JOIN Machine M
WHERE L.operator_id = O.operator_id
AND size >5);
我觉得我把事情复杂化了,可能有更好的方法。
ALL
子查询只返回一个machine_id(一行或多行)时,结果为true。 - dnoeth