2014-10-11 43 views
1

非常感谢您的阅读。使用传统的设置操作 - 关系代数

假设一个表的以下摘录(供应商 - 部分SP)

------------------------ 
S# | P# | QTY 
------------------------ 
S1 | P1 | 30 
S1 | P2 | 35 
S1 | P3 | 40 
S2 | P1 | 100 
S2 | P2 | 50 
S3 | P2 | 30 
S4 | P1 | 40 
S4 | P2 | 35 

我有兴趣了解我如何能够形成一个查询,基于-preferebly-只有工会 ,交,差,产品,自然加入,部门等将返回的操作,让我们说供应商数量由S2供应所有这些零件。
我知道,如果我使用:

SP [S# , P#] DIVIDEBY (SP WHERE S# = 'S2') [P#] 

我会得到供应至少所有这些部件作为S2做,但 我不能我怎么能形成查询返回想象中的供应商编号只有提供的供应商编号与供应商S2相同。

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

+0

我做到了。但它看起来很丑陋。让我知道这是否有帮助。 – 2014-10-11 21:42:15

+0

如果您知道提供至少所有这些相同零件的供应商编号,那么您可以从那些提供非S2提供零件的供应商中扣除。对于你而言,你需要一个RA等价物来存在' – 2014-10-11 21:58:37

+0

@MartinSmith - 是否有可能仅仅使用他提到的选项来使一个高效的RA等价物不存在? – 2014-10-11 22:02:37

回答

1

让我知道这是否有帮助。我正在使用自加入。

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' 
+0

它们并不表示可供他们使用的关系代数运算符支持聚合。 – 2014-10-11 21:59:36

+0

就我而言,这是一个出色的解决方案。谢谢。 – 2014-10-12 20:49:18

+0

谢谢。我不确定它是否因为它进行两次扫描而出色。你可能想与Bill Karwin,Gordon Linoff,Bluefeet等人进行核对......这些人很好。 Chenqui。 – 2014-10-13 01:15:46