2013-03-21 26 views
-1

我有一個表Circuits其中包含列和一些其他信息。我有一個表,其中包含CircuitID列和一些其他信息

我也有一個表Ports其中包含PortID和一些其他信息。

,我還沒有另一個表Connections包含,A_PortIDA_FacingZ_PortIDZ_Facing和其他一些信息。正面只能分別表示前面和後面的「F」或「R」。

進入「F」前部的任何連接都連接到「R」後部。

基本上我需要的是檢索包含和電路每端的端口ID的視圖。

例如。

對於電路 「1」 的連接表內

CircuitID, A_PortID, A_Facing, Z_PortID, Z_Facing 
------------------------------------------------- 
1    1   "F"  2  "R" 
1    2   "F"  3  "F" 
1    3   "R"  4  "R" 

所以整個對於電路連接變得

1 "F" <---> 2 "R" <> 2 "F" <---> 3 "F" <> 3 "R" <---> 4 "R" 

所以對於電路中,PortID1=1Facing1="F"PortID2=4Facing2="R"

由於每個電路的連接數量不盡相同,我正在考慮使用存儲過程或函數從每個電路獲得任何1個連接。

這樣,我可以利用PortID並面對,然後調用另一個子過程或函數來確定下一個連接的結束。它將保持循環,直到沒有端口連接到遠端。

有了這個,我將能夠得到PortID和麪對這個遠程端。

接下來我將執行相同的功能來檢查另一端。

最後,我需要將結果按分組,並獲得連接PortID的每個端點並面對。

希望任何人都可以建議我是否應該使用存儲過程或函數。然後繼續循環並調用另一個子過程或函數。我不確定哪個更適合這種用途。存儲過程或功能。

我已經創建子過程只是爲了尋找下一個連接

CREATE PROCEDURE dbo.GetNextEnd(@Portid int, @Facing varchar) 
AS 
SELECT Connections.Z_PortID AS RemotePortID, Connections.Z_Facing AS RemoteFacing, 
    Connections.Z_RackID As RemoteRackID, Connections.Z_Description As RemoteDescription FROM Connections WHERE Connections.A_PortID = @PortID AND Connections.A_Facing = @Facing 
    UNION 
    SELECT Connections1.A_PortID AS RemotePortID, Connections1.A_Facing AS RemoteFacing, 
    Connections1.A_RackID As RemoteRackID, Connections1.A_Description As RemoteDescription FROM Connections AS Connections1 WHERE Connections1.Z_PortID = @PortID AND Connections1.Z_Facing = @Facing 

希望有人也可以顯示如何在主過程的循環使用任何例子或者函數來調用上述子過程。

我一直在嘗試幾個星期,仍然無法讓它在SQL中工作。請幫助我...

+0

這個問題很痛苦看 – 2013-03-21 14:52:20

回答

0

在您給出的示例中,portid是有序的,所以最小值是第一個,最大值是最後一個。如果這是真的,那麼問題很簡單:

select circuitId, min(portId), max(portid) 
from Connections 
group by circuitId 

如果不是這樣,那麼您需要提供有關您正在使用的數據庫的信息。您需要使用遞歸CTE來解決問題(SQL Server,Postgres)或connect by子句(Oracle)。或放棄(MySQL,Access);)好的,放棄太強大了,但是你必須在存儲過程中做很多編碼。

+0

最小的值可能不是第一個,最後一個值可能不是最後一個值。最後嘗試並能夠使用主存儲過程並繼續循環子過程,直到找不到更多連接。仍在取得所需結果。不確定它是否會起作用。 – user1997296 2013-03-21 15:51:35

相關問題