除法的关系代数翻译
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
秒。例如,在您链接的论文中,a1
和 a3
是唯一与 b2
和 b3
相关的 A
。 WHERE B IN ( SELECT B FROM T2 )
行过滤 T1
的行,以便只有 b2
或 b3
的行在 B
列中。这相当于 T1
和 T2
之间的 INNER JOIN
在它们各自的 B
上。
请注意 T1
或 T2
中没有重复条目。一些等效查询(加上期刊中的等效查询,但请注意他们的警告,如果 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。
我看到了这本期刊: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
秒。例如,在您链接的论文中,a1
和 a3
是唯一与 b2
和 b3
相关的 A
。 WHERE B IN ( SELECT B FROM T2 )
行过滤 T1
的行,以便只有 b2
或 b3
的行在 B
列中。这相当于 T1
和 T2
之间的 INNER JOIN
在它们各自的 B
上。
请注意 T1
或 T2
中没有重复条目。一些等效查询(加上期刊中的等效查询,但请注意他们的警告,如果 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。