Sql 传统集合运算的使用——关系代数

Sql 传统集合运算的使用——关系代数,sql,relational-database,relational-algebra,Sql,Relational Database,Relational Algebra,非常感谢你的阅读 假设以下表格摘录(供应商-零件SP) 我感兴趣的是找出如何形成一个查询,最好是只基于 联合、交叉、差异、产品、自然连接、分割等操作将返回S2提供的所有零件的供应商编号。 我知道如果我使用: SP [S# , P#] DIVIDEBY (SP WHERE S# = 'S2') [P#] 我将获得供应商编号,该编号至少提供所有这些零件,但S2不提供 我无法想象如何形成查询,只返回与供应商S2供应完全相同零件的供应商编号 这个问题是基于个人的科学兴趣 如果有帮助,请告诉我。我正在

非常感谢你的阅读

假设以下表格摘录(供应商-零件SP)

我感兴趣的是找出如何形成一个查询,最好是只基于 联合、交叉、差异、产品、自然连接、分割等操作将返回S2提供的所有零件的供应商编号。
我知道如果我使用:

SP [S# , P#] DIVIDEBY (SP WHERE S# = 'S2') [P#] 
我将获得供应商编号,该编号至少提供所有这些零件,但S2不提供 我无法想象如何形成查询,只返回与供应商S2供应完全相同零件的供应商编号


这个问题是基于个人的科学兴趣

如果有帮助,请告诉我。我正在使用自联接

select *  
from infoz as t1 
inner join infoz as t2
on t1.P# = t2.P#
where t1.S# = 's2'
让我们筛选此信息

select t2.S#, COUNT(t2.P#) as cnt
from infoz as t1 
inner join infoz as t2
on t1.P# = t2.P#
where t1.S# = 's2'
group by t2.S#
现在,您可以在这里看到S2的计数,并根据它进行过滤

select *
from
(
select t2.S#, COUNT(t2.P#) as cnt
from infoz as t1 
inner join infoz as t2
on t1.P# = t2.P#
where t1.S# = 's2'
group by t2.S#
) as r1
where r1.cnt = (select count(t.P#) 
from infoz as t
where t.S# = 's2') and r1.S# ! = 's2'

我做到了。但这是一个丑陋的问题。让我知道这是否有帮助。如果您知道至少供应所有相同零件的供应商编号,您可以从中减去供应非S2供应零件的供应商。对于不存在的情况,你需要一个RA等价物@MartinSmith-是否可以仅使用他提到的选项,为不存在的情况制作一个有效的RA等价物?@BoratSagdiyev效率不是RA的一个方面,因为它只是理论上的。但是是的,谷歌搜索
不存在关系代数
应该会带来一些东西。@MartinSmith-哦,是的……很多结果。一个来自某地。谢谢。他们并没有指出可用的关系代数运算符支持聚合。就我而言,这是一个绝妙的解决方案。谢谢,谢谢。我不确定它是否精彩,因为它做了两次表格扫描。你可能想问问比尔·卡温、戈登·林诺夫、蓝脚等等……这些人都很好。陈基。
select *
from
(
select t2.S#, COUNT(t2.P#) as cnt
from infoz as t1 
inner join infoz as t2
on t1.P# = t2.P#
where t1.S# = 's2'
group by t2.S#
) as r1
where r1.cnt = (select count(t.P#) 
from infoz as t
where t.S# = 's2') and r1.S# ! = 's2'