我有一个与SQL和关系微积分有关的问题。
我想知道是否有办法宣布一个"至少2"在元组中的陈述。为方便起见,它可以用SQL编写,因为Tuples和SQL具有类似的语法。
首先,让模型为:
提供商(1)------(*)订单//提供商有很多订单,订单属于一个提供商
第(1)条-------(*)订单//一篇文章属于许多订单,每个订单都是一篇文章。
要解决的问题是:
获取所有提供ID!= 5的提供者的ID,该ID提供由ID = 5的PROVIDER提供的至少两篇文章。
问题在于,在SQL中有一些工具,例如HAVING,GROUP BY,DISTINCT和COUNT,可以让它变得如此简单:
SELECT O1.ID_PROV FROM ORDER O1 JOIN ORDER O2 ON
O1.ID_ART = O2.ID_ART
WHERE O1.ID_PROV != 5 AND O2.ID_PROV = 5
GROUP BY O1.ID_PROV
HAVING COUNT(DISTINCT O1.ID_ART) > 1;
但在使用元组的关系演算中,没有这样的工具。所以这可以被解释为试图为#34;至少两个"创建SQL。不使用COUNT,HAVING,DISTINCT和GROUP BY; 只是加入,选择和在哪里。
我已经做了几次尝试,但在一些细节上失败了。
我最接近的尝试是:
SELECT O3.ID_PROV FROM ORDER O1, ORDER O2, ORDER O3 WHERE
O1.ID_PROV = 5
AND O2.ID_PROV != 5
AND O3.ID_PROV != 5
AND O1.ID_ART = O2.ID_ART
AND O1.ID_ART = O3.ID_ART
AND O2.ID_PROV = O3.ID_PROV;
问题在于:
让我们说这是订单表:
ID_PROV ...... ID_ART
5 ......................... 1
5 ........................ 2
1 ......................... 1
1 ......................... 1
3 ......................... 1
3 ......................... 2
我的尝试将计算Provider-1。即使他只交付了一篇文章,因为他送了两次。 并且正确地说,它也将返回provider-3。
感谢您的帮助,对不起,我尽量保持清醒。
答案 0 :(得分:1)
我认为您正在寻找的SQL查询是:
SELECT DISTINCT o3.id_prov
FROM order o1
INNER JOIN order o2 ON o2.id_prov = o1.id_prov AND o1.id_art <> o2.id_art
INNER JOIN order o3 ON o3.id_prov <> o1.id_prov AND o3.id_art = o1.id_art
INNER JOIN order o4 ON o4.id_prov = o3.id_prov AND o4.id_art = o2.id_art
WHERE o1.id_prov = 5
我使用DISTINCT,因为关系是一个集合,并且不能多次包含相同的元组,而SQL允许重复的行。
在查询中,o1和o2从同一个提供程序中选择两个不同的文章。 o3和o4查找来自不同提供商的相同两篇文章。最后,我将第一个提供程序限制为id_prov = 5.