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.
- 提供商有 (ID_Prov)
- 文章有 (ID_Art)
- 订单有(ID_Prov,ID_Art)
要解决的查询是:
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.
我有一个与 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.
- 提供商有 (ID_Prov)
- 文章有 (ID_Art)
- 订单有(ID_Prov,ID_Art)
要解决的查询是:
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.