sql - 将聚合运算符从 SQL 转换为关系代数

标签 sql aggregate relational-algebra

我有几个 SQL 查询要转换为关系代数。但是,一些查询使用聚合运算符,我不知道如何转换它们。值得注意的是,他们使用 COUNT 和 GROUP BY.. HAVING 运算符。

这是架构:

Sailors(sid, sname, rating) 储备(sidbid、价格) 船(出价,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/

相关文章:

sql - ORA-01839 "date not valid for month specified"对于 where 子句中的 to_date

sql - 非主键列上的聚集索引还是非聚集索引?

python - Dataframe 上的多种操作

sql - 如何在关系代数中用 HAVING COUNT(*)>1 表示 GROUP BY?

java - JPA 标准在所选日期上添加一天

mysql - 库存系统 - SQL 不显示缺货商品

python-3.x - pandas 枢轴计算最大日期和第二个最大日期之间的差异

time-series - 滑动窗口聚合 Bigquery 15 分钟聚合

sql - 将 SQL 查询转换为关系代数

mysql - LOAD 是关系代数运算符吗?