Peut-être que je vais dans le mauvais sens. Voici ce que j'essaie de faire et mon problème.Rejoindre une table deux fois dans une deuxième table avec chaque alias interne joint aux deux alias d'une troisième table
J'ai 3 tables. actifs (un ordinateur, un appareil de réseau, etc.) ports (un port sur l'ordinateur, périphérique réseau, etc.) port_connections (a un champ port_id_a et port_id_b et des liens chaque port et à cet effet chaque actif ensemble)
Il est vraiment juste un moyen de suivre VLAN et les périphériques réseau/ordinateurs dans les immeubles de bureaux. J'utilise la dernière version de Firebird en utilisant le dialecte 3. Je suppose que ce n'est pas un problème de Firebird et juste un problème avec mon SQL.
Je sais que cela doit être possible parce que je peux le faire avec juste des jointures correctes (ports à port_connections) et faire les autres jointures dans la clause WHERE. Le problème avec ceci est que les jointures correctes sont perdues lorsque je joins la table des assets à la table des ports.
EDIT: c'est la nouvelle requête avec laquelle je travaille car les anciennes sont inutiles à ce stade. Mon problème avec cette nouvelle requête est qu'il semble tirer deux fois les éléments qui sont liés à la table port_connections. Donc, je vais obtenir l'enregistrement port_connections correct et puis je reçois un enregistrement en double avec seulement le port unique sans port_connection. Je dois me débarrasser de cet enregistrement plus tard mais garder les autres enregistrements de port qui n'ont pas d'enregistrement 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
Tableaux: actifs:
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
ports
PORT_ID
ASSET_ID
PORT
TITLE
DESCRIPTION
"TYPE"
SPEED
EDIT: Le correctif a été de déplacer le connection_id dans la table des ports et e est la requête fait alors ce que je voulais.
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
Serait-il possible de modifier votre question pour inclure le schéma de ces trois tables? J'essaie de donner un sens aux jointures et c'est difficile sans une disposition de table pour le mettre ensemble. – SqlRyan