SQL 和元组至少有 2 个

At least 2 for SQL and Tuples

我有一个与 SQL 和元组关系演算相关的问题。

我想知道是否有办法在元组中声明“至少 2”语句。为方便起见,它可以写成 SQL,因为元组和 SQL 具有相似的语法。

首先,假设模型是:

Provider (1) ------ (*) Order // A provider has many orders, an order belongs to one provider

Article(1) ------- (*) Order // An article belongs to many orders, every order is of one article.

要解决的查询是:

Get the ID of all the PROVIDERS with ID != 5 that delivered at least two articles delivered by the PROVIDER with ID = 5.

问题是 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;

但是在 Relational Calculus with Tuples 中没有这样的工具。因此,这可以解释为试图在不使用 COUNT、HAVING、DISTINCT 和 GROUP BY 的情况下为“至少两个”创建 SQL; 只是连接,Select 和 Where。

我已经做了几次尝试,但在一些细节上失败了。

我最接近的尝试是:

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;

问题是:

假设这是订单的 table:

ID_PROV......ID_ART

5 .....................1

5 .....................2

1......................1

1......................1

3......................1

3......................2

我的尝试将算作 Provider-1。即使他只发表了一篇文章,因为他发表了两次。 并且正确地,它也会 return provider-3.

感谢您的帮助,抱歉篇幅过长,我试图尽可能清楚。

我认为您正在寻找的 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 select 来自同一提供商的两篇不同文章。 o3 和 o4 从不同的提供者处查找相同的两篇文章。最后,我将第一个提供者限制为 id_prov = 5.