我有一个表Circuits
,其中包含一列CircuitID
以及其他一些信息。
我还有一个表Ports
,其中包含PortID
和其他一些信息。
我还有另一张表Connections
,其中包含CircuitID
,A_PortID
,A_Facing
,Z_PortID
,Z_Facing
以及其他一些信息。饰面只能分别为'F'或'R',分别表示前后。
进入“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=1
和Facing1="F"
以及PortID2=4
和Facing2="R"
由于每个电路的连接数量不同,我正在考虑使用存储过程或函数从每个电路获得任何1个连接。
有了这个,我可以使用PortID
并面对,然后调用另一个子过程或函数来确定下一个连接端。它会一直循环,直到没有端口连接到远程端。
有了这个,我将能够得到PortID
并面对这个远程端。
接下来,我将执行相同的功能来检查另一端。
最后,我需要按CircuitID
对结果进行分组,并获得连接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 :(得分:0)
在您给出的示例中,portid是有序的,因此最小值是第一个,最大值是最后一个。如果这是真的,那么问题就很容易了:
select circuitId, min(portId), max(portid)
from Connections
group by circuitId
如果不是这样,那么您需要提供有关您正在使用的数据库的信息。您将需要使用类似递归CTE的东西来解决问题(SQL Server,Postgres)或connect by
子句(Oracle)。或放弃(MySQL,Access);)好吧,放弃太强大,但你必须在存储过程中做很多编码。