-1

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

我还有一张Ports包含PortID其他信息的表格。

我还有另一个表,Connections其中包含CircuitIDA_PortIDA_Facing、和其他一些信息。正面只能是“F”或“R”,分别表示正面和背面。Z_PortIDZ_Facing

任何进入“F”前部的连接都连接到“R”后部。

基本上我需要的是检索包含CircuitID电路每一端的端口 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=1and Facing1="F"and PortID2=4andFacing2="R"

由于每个电路的连接数量各不相同,我正在考虑使用存储过程或函数从每个电路获取任何 1 个连接。

有了这个,我可以利用PortID和面对,然后调用另一个子过程或函数来确定下一个连接端。它将一直循环,直到没有端口连接到远程端。

有了这个,我将能够得到PortID这个远程端的和面向。

接下来我将执行相同的功能来检查另一端。

最后,我需要对结果进行分组,CircuitID并获取连接端口 ID 和朝向的每一端。

希望任何人都可以建议我应该使用存储过程还是函数。然后继续循环并调用另一个子过程或函数。我不确定哪个更适合这种用途。存储过程或函数。

我创建了一个子过程只是为了找到下一个连接

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 中工作。请帮我...

4

1 回答 1

0

在您给出的示例中,portid 是有序的,因此最小值是第一个,最大值是最后一个。如果这是真的,那么问题很简单:

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

如果这不是真的,那么您需要提供有关您正在使用的数据库的信息。您将需要使用诸如递归 CTE 之类的东西来解决问题(SQL Server、Postgres)或connect by子句(Oracle)。或者放弃(MySQL,Access);)好吧,放弃太强了,但是你必须在存储过程中做很多编码。

于 2013-03-21T14:58:54.630 回答