分裂的关系代数翻译

时间:2015-10-27 17:03:56

标签: sql relational-algebra relational-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”语句是否删除重复项?

2 个答案:

答案 0 :(得分:1)

没有。关系代数除法采用一组关系(A,B),并返回A的集合,以便AB的给定子集的所有成员之间存在关系。 。例如,在您关联的论文中,a1a3是唯一与Ab2有关系的b3。行WHERE B IN ( SELECT B FROM T2 )会过滤T1行,以便只有b2b3的行位于B列中。这相当于INNER JOINT1之间的T2B之间的T1

请注意,T2T2中没有重复的条目。一些等效的查询(加上日记中的等价查询,但请注意,如果 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 ); 为空,这些查询返回空集,不像论文的Q1):

// in MainWindow.xaml
 <HelixToolkit:HelixViewport3D x:Name ="viewPort" ZoomExtentsWhenLoaded="True" Margin="250,-15,0,15">

// in MainWindow.cs Constructor
this.viewPort = new HelixViewport3D();
foreach(string path in meshPaths){
    ModelVisual3D meshModel = loadMesh(path);
    viewport.Children.Add(meshModel);
}

答案 1 :(得分:0)

你的问题不清楚。但是你似乎要问下面的查询问题Q0:当一行T1匹配T2的多个/重复行时,会使用COUNT等于过滤结果,所以不能给出正确答案吗?

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

对于处理SQL中重复项的版本,你必须决定你想要什么&#34;除以&#34;表示何时存在重复行。您可以重复使用代数定义,同时将其他代数运算符的名称命名为SQL / bag运算符,但根据您的定义,您会得到不同的结果。

无论如何Q0没有返回分区。分区可以返回T1中没有出现在T2中的T1行; Q0不能。除法返回T1的行AB,其中A出现在T1中,T2的每一行和T2的某一行。 Q0返回T1的行AB,其中A出现在T1中,每行T2,只有T2行。

事实上,关系划分,Q0和Q1要求三组不同的行。 Q1返回T1的行AB,其中A出现在T1中,每行为T2。

这篇论文写得不好:

  • Q0不计算关系师。

  • 本文称查询Q1为经典版本&#34;分裂,但Q1不是分裂。 (论文承认这一点通过&#34; Q0和Q1的代码产生两种不同的结果&#34;但是通过调用Q1和#34;实现除法运算符&#34;以及Q0&#34;替代它自相矛盾实施&#34;。)

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