当前位置: 首页 > 面试题库 >

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

葛智敏
2023-03-14
问题内容

我编写了一些SQL查询,希望将其转换为关系代数。但是,某些查询使用聚合运算符,而我不知道如何转换它们。值得注意的是,它们使用COUNT和GROUP BY
.. HAVING运算符。

这是模式:

水手( sid ,sname,评分)储备( sid出价 ,价格)船( 出价 ,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;

如果 我们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;

如果
我们有限制(WHERE在SQL中)和半差分(又名antijoin)运算符(例如NOT IN在SQL中):

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查询转换为ActiveRecord关系,以便可以使用范围对其进行扩展? 这是我必须尝试直接使用Arel的东西吗? 我尝试将其分解为作用域/子查询,但是子查询上的选择最终在封闭查询中,因此引发PostgreSql错误,因为未在封闭语句中的GROUP BY或ORDER BY中指定该列。 更新: 您认为它是PostgreSql是正确的。我尝试了您的查询,但是对于直接查询和Ac

  • 问题内容: 如何将字符串转换成运算符plus?谢谢! 问题答案: 使用查找表:

  • 我有一个R的聚合函数: 我想将这段代码转换成python并获取数据帧。我怎样才能做到?

  • 问题内容: 这些天,我正在研究SQL和关系代数。我被困在以下问题上。我可以针对以下问题创建SQL,但是以某种方式我制作的关系代数看起来不正确。 以下是我的表格- (EmployeeId, TrainingCode, Grade)` 所有键都用星号*指定。 以下是该问题及其SQL查询,它们可以正常工作- 查找参加过所有培训的员工的ID。 SQL Qyery: 我无法理解上述查询的关系代数是什么?有人

  • 问题内容: 指定直方图聚合时,是否可以将字符串转换为浮点数?因为我的文档中的字段是浮点型的,但没有通过Elasticsearch解析,因此当我尝试使用字符串字段求和时,它将引发下一个错误。 我知道我可以更改映射,但是对于我有的用例,如果在编写字段的聚合时可以指定类似“ script:_value.tofloat()”的内容,则将更加方便。 这是我的代码: } 问题答案: 你需要这个 对于称为的字段

  • Spring数据ElasticSearch 3.2 现在,由于NativeSearchQueryBuilder的addAggregation方法接受AbstractAggregationBuilder,并且sumBucket的类型为PipelineAggregationBuilder,因此无法将此值传递给addAggregation(sumBucket(“sum\u bucket”,“sequen