【问题标题】:Seeking extended Divide operator explanation求扩展 Divide 运算符解释
【发布时间】:2014-07-16 01:53:03
【问题描述】:

我正在阅读 Inside Microsoft SQL Server 2008: T-SQL Querying by Itzik Ben-Gan, Lubor Kollar, Dejan Sarka, and Steve Kass 中有关 Codd 的八个原始运算符的内容,但不了解 Divide 运算符。

定义 Divide 运算符的引号:

“除数关系用于划分除数关系和 产生商关系。商关系由那些组成 股息表中一列的值,第二个 列包含除数中的所有值。”

本声明与Wikipedia's definition and example一致。

“除法算子的公式包括三个关系:a 每个 c 除以 b,其中 a 是被除数,b 是除数,c 是 中介关系。让关系 a 有属性 A 和关系 b 属性 B. Divide 运算符返回包含的关系 来自除数的所有元组,使得元组 {A, B} 出现在 来自除数关系的所有元组的中介关系。”

下图用于演示此语句。我相信这些关系按以下顺序呈现:除数、除数、中介和最终结果。

第二个关系(除数)有 {a, x}, {a, z}, {b, x} 和 {b, z} 用于元组。我的思考过程如下,因为存在元组 {b, x} 和 {b, z},因此 b 应该包含在最终结果中。我已经在本书的网站(链接在本文开头)上检查了本书的更正,并且确定我错了。

为什么图表示例的结果是 a 而不是 ab

【问题讨论】:

    标签: relational-algebra divide relational-division


    【解决方案1】:

    关系部门一直是一团糟,而且很可能会一直如此。它最初是作为关系查询系统能够制定/回答问题的手段而发明的,例如,“订阅了所有可能的保险单类型的客户列表是什么”。也就是说,它旨在作为制定查询的工具,这些查询涉及某种通用量化作为确定结果集的谓词。

    进一步阐述我的客户/保单示例,假设“所有可能的保单类型”的集合本身是随时间变化的,即随着时间的推移,可能会出现新的保单类型,而其他保单类型可能会停止。让我们进一步假设某个查询中的“所有可能的保险单类型”,具体而言,是指“当前开放供客户订阅的所有保单类型”(也就是说,已停产的保单类型不属于这组“ALL " 类型)。

    假设这组“所有可能的策略类型”在某个时刻是{TYPE1, TYPE3}。 TYPE2 已停产。我们还假设客户 ES 仍然有 TYPE2 类型的策略,显然可以追溯到它被停止使用之前。因此客户 ES 的策略类型为 {TYPE1, TYPE2, TYPE3}。

    现在回答此客户是否拥有“所有当前开放订阅的保单类型”的问题。你的回答应该是肯定的“是”。您可能会知道这是怎么回事:关系划分以两个集合的比较为中心。一个是“比较”(客户订阅的策略类型集),另一个是“参考”(当前开放订阅的策略类型集)。

    现在至少可以在集合之间进行两个有用的比较:一个是相等的,另一个是集合包含(子集)。在某些查询情况下,您将需要相等测试,而在其他情况下,您将需要包含测试。并且称为“除法”的关系运算符(无论其丰富的风味如何)都不允许进行这种区分。我认为您要问的是这种现象,答案很简单,可以说选择是由设计做出的,并且硬连线到运营商的定义中。它使运算符在其定义符合您的需求的情况下“有用”,而在其他情况下则无用。

    好消息是,当您必须为关系除法拼写 SQL 时,除法和包含除法之间不会有太大区别(尽管代数根据定义,运算符只是两者之一,而另一个甚至根本没有代数运算符)。主要问题是集合相等性本身在 SQL 中表达起来非常混乱,而且“在关系除法查询中”同样如此......

    然后还有 philip 已经提出的所有有效观点。仔细阅读它们。

    【讨论】:

      【解决方案2】:

      图中的结果确实应该是行 {a} 和 {b}。但是这本书和你的信息混淆了。

      有许多关系 DIVIDE 变体。有 Codd 的分频器、Date 的 Codd 分频器的精简版、Todd 的分频器、Date 和 Darwen 的 Small(Codd-like)分频器和 Great(Todd-like)分频器及其广义的 Small 和 Great 分频器,以及 Darwen 的 per -除法。

      引用和图表来自书中。首先,他们试图谈论 Codd 的分歧,它有两个输入; “除数关系用于划分除数关系”。 (书中甚至说:“这就是 Divide 运算符最初的定义方式。”)但它的第二句话是错误的。首先,它讨论的是列而不是不相交的列集。其次,它将第二个操作数限制为仅具有第一个操作数列的子集。 (这是科德鸿沟的日期的删节版本。)第三,它是难以理解的。设A、B、C是不相交的属性集,AB、BC是与属性集A U B 和B U C的关系。然后Codd的AB DIVIDEBY BC返回出现在AB中的A子行以及出现在BC中的每个B子行。

      维基实际上描述了 Codd 的分歧。所以只有当你忽略上面的问题时,第一个引用“同意”它。

      然后第二个引用是在谈论 不同“扩展”除法运算符。这本书解释说,科德的分歧并不反映在常见情况下使用“为所有人”的自然措辞。然后他们不清楚地介绍了另一个操作员。他们正试图定义小分频器。输入“包括三个关系:a 除以 b 每 c”。显示的图表甚至被标记为“扩展划分”。

      不幸的是,这个定义不仅不合语法,而且难以理解。 A DIVIDEBY B PER AB 返回出现在 A 中的行,这些行在 AB 中显示为子行,每行出现在 B 中。他们应该说它返回被除数中的元组 {A},使得元组 {A,B} 出现在除数中所有元组 {B} 的中介

      那本书一团糟。文笔太可怕了。校对是可怕的。鉴于本节中的文字,没有理由期望答案是正确的。而且,你没有仔细阅读。

      然后你误解了图中的论点。但是您没有注意到,因为您没有遵循定义。因此没有注意到定义是难以理解的。该图显示了关系 A-AB-B-result,即除数-中介-除数-商。所以你又没有仔细阅读。

      确实,{a} 和 {b} 行都应该在结果中。但我不能说你对此是“正确的”,因为你的“思维过程”似乎是“得到一个模糊的印象”。某些含糊之处肯定是由于书中的写作不佳所致。但是你似乎没有注意到这本书是难以理解的。仔细阅读!

      【讨论】:

      • 当你用“不清楚”、“不合语法”、“难以理解”、“一团糟”和“糟糕”等词语来形容这本书时,我认为你说我是不合理的我没有仔细阅读。我确实同意我在尝试阅读这本书时被搞混了很多,因此我迄今为止的理解不能保证是正确的。
      • 如果这本书真的难以理解,那么更好的建议是放弃它,而不是“仔细阅读”!!!
      • @Jesslyn 我尽力写出最有帮助的答案。我引用了与问题相矛盾的明确陈述,大多数是在问题本身中。 (但也许我不够清楚。)
      • @ErwinSmout 也许放弃这本书是个好建议。我考虑过。但这是“以及”而不是“而不是”的情况。消息引用和引用然后与明确的事情相矛盾。
      猜你喜欢
      • 2016-09-29
      • 1970-01-01
      • 2018-12-21
      • 2019-05-08
      • 1970-01-01
      • 2021-07-21
      • 2018-08-11
      • 2017-12-20
      • 2016-09-20
      相关资源
      最近更新 更多