2015-09-06 30 views
0

我有一個與元組和關係微積分相關的問題。SQL和元組至少2個

我想知道是否有辦法在元組中聲明「至少2個」語句。它可以用SQL編寫,因爲元組和SQL有相似的語法。

首先,讓我們asume的模型爲:

提供商(1)------(*)令//甲提供商許多訂單,訂單屬於一個提供商

文章(1)-------(*)訂單//一篇文章屬於很多訂單,每個訂單都是一篇文章。

  • 提供具有(ID_Prov)
  • 文章有(ID_Art)
  • 訂單(ID_Prov,ID_Art)

和查詢解決的是:

獲取所有提供ID的ID!= 5的PROVIDERS 至少有兩個通過與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; 

但是在使用元組的關係演算中,沒有這樣的工具。所以這可以被解釋爲試圖爲「至少兩個」創建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

so..only'3'應該是針對每個樣本數據查詢的結果嗎? –

+0

是的,在這個例子中只有3個應該是答案。 –

回答

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.

+0

It works :)謝謝 –

+0

你願意解釋一下這裏發生了什麼嗎?我試圖把我的頭包裹起來,但我對SQL和Querys一般來說太新了。謝謝。 –

+0

每當我嘗試瞭解第三次加入時,我的大腦都會死亡... –