Vielleicht gehe ich in die falsche Richtung. Hier ist, was ich versuche zu tun und mein Problem.Richtig Join einer Tabelle zweimal zu einer zweiten Tabelle mit jedem Alias inneren Join zu den Aliasen einer dritten Tabelle
Ich habe 3 Tabellen. Vermögen (ein Computer, Netzwerkgerät, usw.) Ports (ein Port auf dem Computer, Netzwerkgerät, usw.) port_connections (hat ein port_id_a und port_id_b Feld und Links jeden Port und dafür jedes Asset zusammen)
Es ist wirklich nur eine Möglichkeit, VLANs und Netzwerkgeräte/Computer in Bürogebäuden zu verfolgen.
Ich benutze die neueste Version von Firebird mit Dialekt 3. Ich gehe davon aus, dass dies kein Problem mit Firebird und nur ein Problem mit meinem SQL ist.
Ich weiß, dass dies möglich sein muss, weil ich es mit genau richtigen Joins (Ports zu port_connections) tun kann und die anderen Joins in der WHERE-Klausel tun. Das Problem dabei ist, dass die Joins verloren gehen, wenn ich die Assets-Tabelle mit der Port-Tabelle verbinde.
EDIT: Dies ist die neueste Abfrage, mit der ich arbeite, weil die alten an dieser Stelle nutzlos sind. Mein Problem mit dieser neuesten Abfrage ist, dass es Elemente zu ziehen scheint, die über die Tabelle port_connections zweimal verbunden sind. So werde ich den richtigen Port Verbindungs-Datensatz bekommen und dann bekomme ich einen doppelten Datensatz mit nur dem einzigen Port ohne Port-Verbindung. Ich muss diesen späteren Datensatz irgendwie loswerden, aber behalte immer noch die anderen Hafendatensätze, die keinen port_connection Datensatz haben.
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
Tables: Vermögen:
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
Häfen
PORT_ID
ASSET_ID
PORT
TITLE
DESCRIPTION
"TYPE"
SPEED
EDIT: Das Update war die connection_id in den Häfen Tisch und th zu bewegen ist Abfrage dann macht was ich wollte.
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
Wäre es möglich, Ihre Frage so zu ändern, dass sie das Schema dieser drei Tabellen enthält? Ich versuche, die Joins zu verstehen, und es ist schwer, ohne ein Tabellenlayout zu kombinieren. – SqlRyan