2017-08-27 1676 views
2

对于一门考试,我被要求得到一个以上租金的客户清单,既作为SQL查询又作为代数表达式。如何用关系代数中的COUNT(*)> 1表示GROUP BY?

由于某些原因,校正不提供代数版本。

所以现在我留下:

SELECT IdClient, Name, ... 
FROM Client 
WHERE IdClient IN (
    SELECT IdClient 
    FROM Rental 
    GROUP BY IdClient 
    HAVING COUNT(*) > 1 
) 

我不知道是否有代数符号标准,因此:

  • Π投影
  • ×笛卡尔积
  • ⋈天然加入
  • σ选择

然后我作为翻译:

Π IdClient, Name, ... (
    σ (count(IdClient)>1) (Π Rental) ⋈ (Client ⋈ Rental) 
) 

但我发现没有来源证明我是对还是错,尤其是对:

  • 数学
  • Π Rental背后的逻辑似乎是一个黑幕业务

我看到使用count()https://cs.stackexchange.com/questions/29897/use-count-in-relational-algebra尽管它没有以相同的方式使用,但我无法找到一种不使用投影的方式(我想避免使用它)。

回答

1

“关系代数”有许多变体,甚至不同关系是什么。你需要告诉我们你应该使用哪一个。

此外,您还没有解释为什么一对RA & SQL查询的含义是“彼此具有相同形式”或“相同”。 (较早的版本。)Same result? Or also some kind of parallel structure?

而且你不解释什么是“获取客户名单”的意思。什么属性做的结果是什么?

如果您尝试写的count你想 - 什么时候请输入&它的基础上输出,在σ count(IdClient)>1 (...)使用的定义 - 你会看到,你不能。那种只需要属性的count不对应于关系运算符。它用于分组表达式中 - 你错过了。这种count & group实际上并没有关系运算符,它们在所谓的关系代数是真正的查询语言,通过SQL辩护设计的无终端,这很容易映射SQL到关系代数,但乞讨如何,我们的问题在代数中聚合。不过,也许这就是你被告知使用的那种“关系代数”。

我看到了使用计数的()有https://cs.stackexchange.com/questions/29897/use-count-in-relational-algebra

代数的本质是唯一的意义上,我们“用”经营者“与”其他运营商则通过运营商话费输出作为其他话务员呼叫的输入。 (因此,某些所谓的代数不是。)在您的链接答案中,分组运算符G输入汇总名称count和属性名称name并影响输出。答案引用数据库系统概念,第5版:

G1, G2, ..., Gn G F1(A1), F2(A2), ..., Fm(Am) (E) 

其中E是任何关系代数表达式; G1,G2,...,Gn构成一组属性列表;每个Fi是一个聚合函数;并且每个Ai是属性名称。

G返回行具有属性G1, ..., A1, ...其中一个或多个的行具有相同子行G1, ...E并且每个Ai保持从上Ai过的那些行聚合Fi输出。

但是,当您阅读&时,答案会使用该定义不正确。 (我得到了,因为它固定的。)正确的是:

π name (σ phone>1 (name G count(phone) (Person))) 

这是明确的,如果你仔细阅读的定义。

G具有误导性的语法。 count(phone)不是运营商的呼叫;它只是一对参数,一个综合名称count &属性名称phone。更少误导性的语法将是

π name (σ phone>1 (name G count phone (Person))) 

一个不需要分组操作员来编写您的查询。这使得了解考试中“关系代数”意味着什么更为重要。如果您不能使用分组操作符,则更难

Π Rental似乎是一个阴凉的生意”还不清楚。你确实使用投影不正确;正确使用是π attributes (relation)。我想你正在使用π试图涉及像G这样的分组运算符。重新“数学背后的逻辑”见this

+0

我返工我的问题,明天,因为它似乎需要全幅对焦理解。 –

+0

如果您编辑,请不要使我的答案无效。我写它从我的意见,即使你的问题不清楚,所以我可以用它作为所有其他不清楚的问题不说,他们正在使用的代数,不要说什么“翻译/转换”是指参考,不要说他们想要的列和/或不理解语法。我可以添加任何你需要(如果你可以使用'count'&'group',我不知道更多你所需要的),但我认为它会更好,如果你问明了的回答和编辑一个新的,明确的问题在这里的链接(以避免downvotes&upvotes)。 PS编辑我的答案。 – philipxy