除法的关系代数翻译

Relational Algebra translation of division

我看到了这本期刊:http://users.dcc.uchile.cl/~cgutierr/cursos/BD/divisionSQL.pdf,它给出了一种将关系代数除法转换为 sql 的方法。我有点怀疑这是否真的有效,

给定 T1 (A,B) and T2(B)

 SELECT A FROM T1 
 WHERE B IN ( SELECT B FROM T2 ) 
 GROUP BY A 
 HAVING COUNT(*) = ( SELECT COUNT (*) FROM T2 );

因为假设在 T1[A,B] 中给定了一行,其中有满足语句

的重复项

where B in (select B from T2),这不会导致 having clause 跳过该行吗?还是 "in" 语句删除重复项?

没有。关系代数除法采用一组关系 (A,B),return 是 A 的集合,使得 A 与给定子集的所有成员之间存在关系 B秒。例如,在您链接的论文中,a1a3 是唯一与 b2b3 相关的 AWHERE B IN ( SELECT B FROM T2 ) 行过滤 T1 的行,以便只有 b2b3 的行在 B 列中。这相当于 T1T2 之间的 INNER JOIN 在它们各自的 B 上。

请注意 T1T2 中没有重复条目。一些等效查询(加上期刊中的等效查询,但请注意他们的警告,如果 T2 为空,则这些查询 return 为空集,这与论文的 Q1 不同):

 SELECT A FROM T1 
 WHERE EXISTS(SELECT 1 FROM T2 WHERE T2.B = T1.B) 
 GROUP BY A 
 HAVING COUNT(*) = ( SELECT COUNT (*) FROM T2 );

 SELECT A FROM T1 
 INNER JOIN T2 ON T1.B = T2.B
 GROUP BY A 
 HAVING COUNT(*) = ( SELECT COUNT (*) FROM T2 );

你的问题不清楚。但是您似乎在询问该查询 Q0 的以下内容:当 T1 的一行与 T2 的 multiple/duplicate 行匹配时,将使用 COUNT 相等性将其从结果中过滤掉,因此不会给出正确的答案?

如果 T1 [sic] 中的行没有重复项,那么它将被过滤掉。 (否则它可能会也可能不会。)但是关系代数中没有重复的行,所以这一切都没有实际意义。

对于在 SQL 中处理重复项的版本,您必须决定 "divide by" 在存在重复行时的含义。您可以重用代数定义,同时将其他代数运算符的名称命名为类似 SQL/bag 运算符,但根据您开始的定义,您会得到不同的结果。

反正Q0不return除法。可以划分T1中B不出现在T2中的return行; Q0 不能。除法 returns T1 的 AB 行,其中 A 与 T2 的每一行和 T2 的某些行一起出现在 T1 中。 Q0 returnT1 的 AB 行,其中 A 与 T2 的每一行一起出现在 T1 中,并且仅出现在 T2 的行中。

实际上关系划分,Q0和Q1要求三组不同的行。 Q1 returns T1 的 AB 行,其中 A 与 T2 的每一行一起出现在 T1 中。

论文写得不好:

  • Q0不计算关系除法

  • 论文称查询Q1为除法"classical version",但Q1不是除法。 (该论文通过 "the code for Q0 and Q1 produce two different results" 承认了这一点,但通过将 Q1 称为 "implementation of the division operator" 和 Q0 "an alternative implementation" 而自相矛盾。)

PS:当且仅当指定了 DISTINCT 时,SELECT 才删除重复项。 IN 告诉您某行是否在 table 中。询问某行是否在 DISTINCT 版本中始终与询问它是否在非 DISTINCT 版本中相同。假设我们想要子行位于子选择中的行,则无需使用 DISTINCT。