关系代数 - 表示'having'子句的正确方法是什么?

时间:2010-01-15 03:23:56

标签: relational-algebra

是的,这是一个家庭作业问题但是名字已经改变以保护无辜者。意思是,我不是要问作业问题本身,而是要求它的一小部分,这样我才能理解整体。

假设你有一个这样的SQL查询:

- 查询会列出多次出现的汽车价格。

select car_price from cars
group by car_price
having count (car_price) > 1;

关系代数中的一般形式是Y(gl,al)R 其中Y是希腊符号,GL是要分组的属性列表,AL是聚合列表

所以关系代数看起来像:

 Y (count(car_price)) cars

那么,在该声明中如何写出“having”条款?有简写吗?如果没有,我只需要从那种关系中选择吗?这样的事可能吗?

SELECT (count(car_price) > 1) [Y (count(car_price)) cars]

我已经在互联网上搜索了几个小时,没有找到将HAVING转换为关系代数的例子。谢谢你的帮助!

2 个答案:

答案 0 :(得分:3)

从(选择*来自价格> 1的汽车)中选择计数(*)作为汽车;

也称为关系闭合。

答案 1 :(得分:0)

对于所提出的实际问题,或多或少精确的答案,“关系代数 - 表示'拥有'条款的正确方法是什么?”,首先需要说明问题本身似乎暗示,或者假设存在“THE”关系代数这样的东西,但这种推定完全是不真实的!

代数是一组运算符,任何人都可以定义他喜欢的任何运算符集,这意味着任何人都可以定义他喜欢的任何代数!在他最近的出版物中,Hugh Darwen提到RESTRICT不是代数的基本运算符,尽管很多其他人都认为它是这样的。

特别是在汇总和摘要方面,关于如何将这些纳入关系代数的问题几乎没有达成共识。定义运算符,例如COUNT()(将关系作为参数值并返回整数)作为代数的一部分,可能与代数的闭包属性有问题,正是因为这样的运算符不返回关系...

所以抱歉,但最合适的答案似乎是这个问题的结论性答案几乎不可能给出......