在关系代数中选择DISTINCT行

18
在SQL中有一个DISTINCT运算符。但是,我有一个只能使用关系代数的作业,需要从表中获取一些不同的值。是否有方法可以做到这一点?

也许您可以使用除法运算符 Rel1 ÷ Rel1! - Jahan Zinedine
3个回答

45

关系运算符始终返回不同的元组,因此不需要使用DISTINCT。在关系代数中,不允许重复的元组 - 这是关系模型和SQL模型之间的一个主要区别。


我知道这是一个老问题,但我必须反对,关系代数中确实有一个明显的like运算符,在我的Ullmans数据库系统完全手册的以下章节中:5.2.1重复消除。是的,当然,正常集合中不允许重复项,但有多重集合可以允许它们。 - Dave Demirkhanyan
6
嗨,DDavid,我认为你可能没有理解Molina、Ullman、Widom所提出的观点(顺便说一下,这是一本非常好的书,我经常参考)。摘自第5.2节:“当最初开发使用关系模型的DBMS时,它们的查询语言大多实现了关系代数。然而......这些系统将关系视为bags(袋子),而不是集合。”(我强调了这一点)。他们接着指出,"bag"操作与RA支持的集合操作不同。SQL的DISTINCT“运算符”取一个元组包并消除重复项。而RA仅处理元组集合。 - nvogel

6

关系代数基于集合论。 SQL是多重集合理论的实现。集合总是具有不同的元素,因此在关系代数中,默认情况下元组是不同的。


1
关系代数中的投影操作相当于选择不同记录。在SQL的select语句中,由于它基于多重集合理论,允许存在重复记录,但是在基于集合理论的关系代数的投影操作中,不允许存在重复记录。
因此,关系代数中等价于"select distinct"的操作是投影。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接