Jes*_*lyn 5 relational-algebra divide relational-division
我正在阅读Itzik Ben-Gan,Lubor Kollar,Dejan Sarka和Steve Kass撰写的有关Codd 在Microsoft SQL Server 2008内部的八个原始运算符:T-SQL查询的内容,并且不了解Divide运算符。
引号定义了Divide运算符:
除数关系用于划分股息关系并产生商关系。商关系由除数表中一列的值组成,第二列包含除数中的所有值。”
该声明与Wikipedia的定义和示例一致。
“为除法运算的计算公式包括三个关系:一个 除以b每Ç,其中一个是被除数,b是除数,并且Ç是介体关系。让关系a具有属性A,关系b具有 属性B。除法运算符返回一个关系,该关系包括除数的所有元组,这样对于除数关系的所有元组,元组{A,B}出现在介体关系中。”
下图用于演示此语句。我相信这些关系按以下顺序表示:分红,除数,调解器和最终结果。

第二个关系(除数)具有用于元组的{a,x},{a,z},{b,x}和{b,z}。我的思考过程如下:由于存在元组{b,x}和{b,z},因此应在最终结果中包括b。我已经在该书的网站上检查了该书的更正(在本文开头链接),并且确定我错了。
为什么图示例a而不是a和b的结果?
关系划分一直是一团糟,而且很可能会保持这种状态。它最初被发明作为关系查询系统能够制定/回答诸如“订阅了所有可能的保险单类型的客户的列表是什么”之类的问题的手段。也就是说,它的目的是作为制定查询的工具,该查询涉及某种通用量化作为确定结果集的谓词。
进一步详细说明我的客户/保单示例,我们假设“所有可能的保险保单类型”集合本身是随时间变化的,即随着时间的推移,可以出现新的保单类型,而其他保单类型可以终止。我们进一步假设某个查询中的“所有可能的保险单类型”具体意味着“当前开放供客户订阅的所有保单类型”(即,已终止的保单类型不属于这组“所有保单类型”) “类型)。
我们假设某一时刻的这组“所有可能的策略类型”是{TYPE1,TYPE3}。TYPE2 已停产。我们还假设客户 ES 仍然拥有 TYPE2 类型的保单,显然是在它停止之前的。因此,客户 ES 具有类型为 {TYPE1, TYPE2, TYPE3} 的策略。
现在回答该客户是否拥有“当前可供订阅的所有保单类型”的问题。您的回答应该是坚定的“是”。您可能会明白这是怎么回事:关系划分以两个集合的比较为中心。一个是“比较”(客户订阅的一组保单类型),另一个是“参考”(当前开放订阅的一组保单类型)。
现在,在集合之间至少可以进行两种有用的比较:一种是相等性,另一种是集合包含性(子集性)。在某些查询情况下,您将需要相等测试,而在其他情况下,您将需要包含测试。而被称为“除法”的关系运算符(无论它的风格如何)不允许做出这种区分。我猜您所问的就是这种现象,答案很简单,选择是通过设计做出的,可以这么说,并且硬连线到操作员的定义中。它使运算符在其定义符合您的需求的情况下“有用”,而在其他情况下则无用。
好消息是,当您必须拼写关系除法的 SQL 时,等号除法和包含除法之间不会有太大区别(尽管代数运算符是,根据定义,只有两者之一,而另一个甚至没有代数运算符)。主要问题是,集合相等性本身在 SQL 中表达起来非常混乱,“在关系除法查询内部”也同样如此......
菲利普已经提出的所有有效观点仍然存在。阅读它们,但要非常仔细。