SQL和元组至少有2个

时间:2015-09-06 22:34:55

标签: sql database relational-database

我有一个与SQL和关系微积分有关的问题。

我想知道是否有办法宣布一个"至少2"在元组中的陈述。为方便起见,它可以用SQL编写,因为Tuples和SQL具有类似的语法。

首先,让模型为:

  

提供商(1)------(*)订单//提供商有很多订单,订单属于一个提供商

     

第(1)条-------(*)订单//一篇文章属于许多订单,每个订单都是一篇文章。

  • 提供商有(ID_Prov)
  • 文章有(ID_Art)
  • 订单有(ID_Prov,ID_Art)

要解决的问题是:

  

获取所有提供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。

感谢您的帮助,对不起,我尽量保持清醒。

1 个答案:

答案 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.