-1

CircuitsCircuitIDとその他の情報を含むテーブルがあります。

また、その他の情報Portsを含むテーブルもあります。PortID

そして、、 、、、およびその他の情報Connectionsを含むさらに別のテーブルがあります。フェーシングは、それぞれフロントとリアを意味する「F」または「R」のみです。CircuitIDA_PortIDA_FacingZ_PortIDZ_Facing

「F」フロントに入る接続は、「R」リアに接続されます。

CircuitID基本的に必要なのは、回線の両端のポート ID とポート 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 and PortID2=4andFacing2="R"

回路ごとに接続数が異なるため、各回路から任意の接続を取得するストアド プロシージャまたは関数を使用することを考えています。

これにより、 and の向きを利用して、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

あなたが与える例では、ポートIDは順序付けられているため、最小値が最初で最大値が最後です。これが正しい場合、問題は簡単です。

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

そうでない場合は、使用しているデータベースに関する情報を提供する必要があります。connect by問題 (SQL Server、Postgres) または句 (Oracle)を解決するには、再帰 CTE のようなものを使用する必要があります。またはあきらめる (MySQL、Access) ;) わかりました。あきらめるのは強すぎますが、ストアド プロシージャで多くのコーディングを行う必要があります。

于 2013-03-21T14:58:54.630 に答える