多分、私は間違った方法をしています。ここで私がやろうとしていることと私の問題です。2番目のテーブルに2番目のテーブルを右結合すると、各エイリアスの内側が3番目のテーブルの2つのエイリアスに結合されます
私は3つのテーブルを持っています。 資産(コンピュータ、ネットワーク機器、など) ポート port_connections(コンピュータ、ネットワーク機器などのポート)
は、それは本当にです(port_id_aとport_id_bフィールドとリンクの各ポートとその一緒にそれぞれの資産を持っています)オフィスビル内のvlansやネットワークデバイス/コンピュータを追跡するための方法です。
私はdialect 3を使ってFirebirdの最新バージョンを使用しています。これはFirebirdの問題ではなく、自分のSQLに問題があると仮定しています。
私は正しい結合(port_connectionsへのポート)でそれを行い、WHERE句で他の結合を行うことができるので、これが可能でなければならないことは知っています。この問題は、資産表をポート表に結合するときに右の結合が失われることです。
EDIT:これは私が作業している最新のクエリです。古いものはこの時点では役に立たないためです。この最新のクエリの私の問題は、port_connectionsテーブルを2度経由してリンクされているアイテムを引き出しているようです。だから、私は適切なport_connectionsレコードを取得し、次にポート接続なしで単一のポートだけを使って重複レコードを取得します。私は何とかこの後のレコードを取り除く必要がありますが、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
port_connections
"CONNECTION_ID"
PORT_ID_A
PORT_ID_B
DESCRIPTION
ポート
PORT_ID
ASSET_ID
PORT
TITLE
DESCRIPTION
"TYPE"
SPEED
EDIT:修正は、ポートテーブルと番目に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
質問を修正して、これらの3つのテーブルのスキーマを含めることはできますか?私は結合を理解しようとしており、それをまとめるテーブルレイアウトがなければ難しいです。 – SqlRyan