2

多分私はそれについて間違った方法で行っています。これが私がやろうとしていることと私の問題です。

私は3つのテーブルを持っています。アセット (コンピューター、ネットワーク デバイスなど) ポート (コンピューター、ネットワーク デバイスなどのポート) port_connections (port_id_a フィールドと port_id_b フィールドを持ち、各ポートと各アセットをリンクします)

これは実際には、オフィス ビル内の VLAN およびネットワーク デバイス/コンピュータを追跡する方法にすぎません。

方言3を使用して最新バージョンのfirebirdを使用しています。これはfirebirdの問題ではなく、単にSQLの問題であると想定しています。

適切な結合 (port から port_connections への結合) で実行でき、WHERE 句で他の結合を実行できるため、これが可能であることはわかっています。これに関する問題は、資産テーブルをポート テーブルに結合すると、正しい結合が失われることです。

編集:これは私が取り組んでいる最新のクエリです。古いクエリはこの時点では役に立たないからです。この最新のクエリに関する私の問題は、port_connections テーブルを介してリンクされているアイテムを 2 回プルしているように見えることです。したがって、適切な port_connections レコードを取得してから、port_connection のない単一のポートだけを持つ重複レコードを取得します。この後のレコードをどうにかして取り除く必要がありますが、port_connection レコードを持たない他のポート レコードは保持します。

SELECT
port_connections.connection_id,

asset_a.name AS asset_a_name,
port_a.port AS port_a_name,
port_a.asset_id as asset_a,

asset_b.name AS asset_b_name,
port_b.port AS port_b_name,
port_b.asset_id as asset_b,

port_connections.description

FROM
port_connections

right JOIN ports AS port_a
ON port_connections.port_id_a = port_a.port_id

right JOIN ports AS port_b
ON port_connections.port_id_b = port_b.port_id

left JOIN assets as asset_a
ON asset_a.asset_id = port_a.asset_id

left JOIN assets as asset_b
ON asset_b.asset_id = port_b.asset_id



WHERE
(port_a.asset_id = 2 OR port_b.asset_id = 2)
ORDER BY port_a_name, port_b_name

テーブル: アセット:

ASSET_ID
SYS_ID
LOCATION_ID
NAME
DESCRIPTION
"TYPE"
AQUIRED
DISPOSED
MFG_NAME
TAG_NO

ポート接続

"CONNECTION_ID"
PORT_ID_A
PORT_ID_B
DESCRIPTION

ポート

PORT_ID
ASSET_ID
PORT
TITLE
DESCRIPTION
"TYPE"
SPEED

編集: 修正は、connection_id をポート テーブルに移動することでした。このクエリは、私が望んでいたことを実行します。

SELECT
port_connections.connection_id,

asset_a.name AS asset_a_name,
port_a.port AS port_a_name,
port_a.asset_id as asset_a,

asset_b.name AS asset_b_name,
port_b.port AS port_b_name,
port_b.asset_id as asset_b,

port_connections.description

FROM
port_connections



right JOIN ports AS port_b
ON port_connections.connection_id = port_b.connection_id

right JOIN ports AS port_a
ON port_connections.connection_id = port_a.connection_id

left JOIN assets as asset_a
ON asset_a.asset_id = port_a.asset_id

left JOIN assets as asset_b
ON asset_b.asset_id = port_b.asset_id

WHERE

port_a.asset_id = 2
AND
(port_b.asset_id != 2 or port_b.asset_id is null)

ORDER BY port_a_name
4

1 に答える 1