我有几个 SQL 查询要转换为关系代数。但是,一些查询使用聚合运算符,我不知道如何转换它们。值得注意的是,他们使用 COUNT 和 GROUP BY.. HAVING 运算符。
这是架构:
Sailors(sid, sname, rating) 储备(sid、bid、价格) 船(出价,bname)
这是我正在做的一个示例:查找恰好由 2 名水手预订的所有船只的出价和名称。
SELECT B.bid, B.bname
FROM Boats B, Reserves R
WHERE B.bid = R.bid
GROUP BY R.bid
HAVING 2 = (SELECT COUNT(*)
FROM Reserves R2
WHERE R2.bid = B.bid);
允许的关系代数运算:选择、投影、连接、条件连接、重命名、并集、交集、叉积、除法
最佳答案
这只是答案的一半……
可以使用条件连接和投影找到关系“由两个或多个水手预订的船”,它们都在您允许的操作集中:
SELECT DISTINCT R1.bid
FROM Reserves AS R1
JOIN Reserves AS R2
ON R1.bid = R2.bid
AND R1.sid < R2.sid;
可以使用条件连接(两次)和投影找到关系“由三个或更多水手预订的船”,它们都在您的允许操作集中:
SELECT DISTINCT R1.bid
FROM Reserves AS R1
JOIN Reserves AS R2
ON R1.bid = R2.bid
AND R1.sid < R2.sid
JOIN Reserves AS R3
ON R1.bid = R3.bid
AND R2.sid < R3.sid;
If 我们有一个减号运算符,例如EXCEPT
在标准 SQL 中:
SELECT DISTINCT R1.bid
FROM Reserves AS R1
JOIN Reserves AS R2
ON R1.bid = R2.bid
AND R1.sid < R2.sid
EXCEPT
SELECT DISTINCT R1.bid
FROM Reserves AS R1
JOIN Reserves AS R2
ON R1.bid = R2.bid
AND R1.sid < R2.sid
JOIN Reserves AS R3
ON R1.bid = R3.bid
AND R2.sid < R3.sid;
如果我们有限制(SQL 中的 WHERE
)和半差分(又名 antijoin)运算符(例如 SQL 中的 NOT IN
):
SELECT DISTINCT R1.bid
FROM Reserves AS R1
JOIN Reserves AS R2
ON R1.bid = R2.bid
AND R1.sid < R2.sid
WHERE R1.bid NOT IN (
SELECT DISTINCT R1.bid
FROM Reserves AS R1
JOIN Reserves AS R2
ON R1.bid = R2.bid
AND R1.sid < R2.sid
JOIN Reserves AS R3
ON R1.bid = R3.bid
AND R2.sid < R3.sid
);
...但是您允许的操作集不包括限制、半差或减号:(
关于sql - 将聚合运算符从 SQL 转换为关系代数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7604969/