我遇到了这个期刊: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”语句是否删除重复项?
答案 0 :(得分:1)
没有。关系代数除法采用一组关系(A,B)
,并返回A
的集合,以便A
与B
的给定子集的所有成员之间存在关系。 。例如,在您关联的论文中,a1
和a3
是唯一与A
和b2
有关系的b3
。行WHERE B IN ( SELECT B FROM T2 )
会过滤T1
行,以便只有b2
或b3
的行位于B
列中。这相当于INNER JOIN
与T1
之间的T2
和B
之间的T1
。
请注意,T2
或T2
中没有重复的条目。一些等效的查询(加上日记中的等价查询,但请注意,如果 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。