[英]ALL operator clause in SQL query
我有這個表模式。
Machine(machine_id, size)
Operator(operator_id, name)
OperationLog(machine_id, operator_id, date, comment)
machine_id: FK(Machine)
operator_id: FK(Operator)
假設我想要一個查詢,它只給我操作所有大小超過5平方米的機器的操作員的名字
使用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);
我覺得我太復雜了,而且可能有更好的方法。
計算每個運營商使用的(size >= 5)
不同的機器數量,並將該數量與此類機器的總數量進行比較:
SELECT op.name
FROM operator op
INNER JOIN operationlog l
ON op.operator_id = l.operator_id
INNER JOIN machine m
ON l.machine_id
WHERE m.size >= 5
GROUP BY op.name
HAVING COUNT(DISTINCT m.machine_id) = (
SELECT COUNT(*)
FROM machine
WHERE size >= 5
)
我使用的粉絲group by
和having
用於此目的:
SELECT O.name
FROM Operator O JOIN
OperationLog L
ON L.operator_id = O.operator_id JOIN
Machine M
ON L.machine_id = M.machine_id
WHERE M.size > 5
GROUP BY O.name
HAVING COUNT(DISTINCT M.machine_id) = (SELECT COUNT(DISTINCT M2.machine_id)
FROM Machine M2
WHERE size > 5
);
如果表中沒有重復項,則使用COUNT(*)
而不是COUNT(DISTINCT)
。
我應該注意,我強烈反對你不使用NATURAL JOIN
。 這是一個等待發生的錯誤。 為什么? 它只使用具有相同名稱的列。 它甚至不使用相同的類型。 例如,我創建的大多數表都有CreatedBy
和CreatedAt
列,它們將使用這些列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.