2016-04-15 6 views
0

Der Titel ist wahrscheinlich ein schlechter Titel, aber ich kann nicht glauben, einen besseren ...SQL-Tabellen Join, die sowohl eine 0.59 und eine zu viele Beziehung

Ich habe eine Art von einzigartigen Schema haben, wo das Ich habe 5 Tabellen mit Beziehungen, aber eine der Tabellen hat eine Beziehung mit zwei Tabellen. Um es weniger verwirrend, lassen Sie mich Ihnen das Schema zeigen:

Tabelle A:

AID BID Name 
1 1 101 
2 1 102 
3 1 103 
4 2 104 
5 3 105 
6 4 106 

Wo AID ist die primäre ID Tabelle A und BID ist eine primäre ID Tabelle B

Tabelle B:

BID CID DID Name 
1  null 3  101 
2  null 4  102 
3  1  null 103 
4  2  null 104 

denen entweder CID null oder DID ist null

Tabelle C:

CID DID Name 
1  1  A 
2  2  B 
3  3  A 
4  4  B 
5  5  C 
6  5  A 

Tabelle D:

DID EID Name 
1  1  Alpha 
2  1  Bravo 
3  1  Charlie 
4  1  Echo 
5  2  Delta 

Tabelle E:

EID Name 
1  Home 
2  Away 

Ich weiß, das ein wenig verwirrend sein kann, aber im Grunde können die Daten eines von zwei Dingen tun:

  1. Die Daten in Tabelle A kann die Verbindung B, dann C, dann D dann E oder
  2. Die Daten in Tabelle A können mit B verbunden werden, dann D, dann E

Mein Problem ist, dass ich eine SQL-Abfrage erstellen möchte, die alle Tabellen beitreten wird, wobei A.Name, A.AID und E.Name aus einer beliebigen Zeile mit B.Name LIKE '% Some name%' abgerufen werden. C.Name LIKE '% Name%', D.Name LIKE '% Name%' und E.Name LIKE '% Name%'.

so zum Beispiel möchte ich eine Abfrage, wenn ich E.Name LIKE '% Startseite%' gesetzt ist, wird die Abfrage zurück:

E.Name E.EID D.DID C.CID B.BID A.AID A.Name 
Home  1  3  null  1  1  101 
Home  1  3  null  1  2  102 
Home  1  3  null  1  3  103 
Home  1  4  null  2  4  103 
Home  1  1  1  3  5  103 
Home  1  2  2  4  6  103 

Derzeit meine aktuelle Abfrage nur zurückgibt " zufällige "Daten, und damit meine ich, dass es etwas zurückgibt, aber nicht das Richtige, und ich kann nicht herausfinden, was die Zeilen, die es zurückgibt, gemeinsam haben, dass die Abfrage zieht. Aber im Grunde meine Frage ist:

select ... from tableA, 
inner join tableB on A.BID=B.BID 
inner join tableC on B.CID=C.CID 
inner join tableD on C.DID=D.DID OR B.DID=D.DID 
inner join E.EID = D.EID 
WHERE E.Name LIKE '%Home%'; 

Irgendwelche Vorschläge wäre toll! Vielen Dank!!!

+0

Ihre Abfrage, wie sie jetzt gestellt wird, kann die von Ihnen gepostete Ergebnismenge möglicherweise nicht zurückgeben. 'B.CID = C.CID' lässt keine NULL-Werte von' c.cid' zurück. – Quassnoi

+0

@Aldwoni Entschuldigung für meinen kaputten Kommentar zu deinem Edit (Danke, das 'like' -Tag zu bereinigen, aber du solltest auch andere offensichtliche Fehler entfernen - wie zum Beispiel das Entfernen des" gelösten "Wortes aus dem Titel). – RandomSeed

Antwort

1

Wenn Sie ein paar Ihrer INNER JOINs zu LEFT JOINs ändern, sollten Sie Ihre gewünschten Ergebnisse erhalten.

SELECT e.Name, e.EID, d.DID, c.CID, b.BID, a.AID, a.Name 
FROM TableA a 
INNER JOIN TableB b ON a.BID = b.BID 
LEFT JOIN TableC c ON b.CID = c.CID 
INNER JOIN TableD d ON c.DID = d.DID or b.DID = d.DID 
INNER JOIN TableE e ON d.EID = e.EID 
WHERE e.Name LIKE '%Home%' 
+0

Ihre Antwort und Quassnois Antwort funktionieren beide perfekt! Vielen Dank! – Jwags

+0

Warum die linke Verbindung zu 'd'? – Quassnoi

+0

Übersehen es. Vielen Dank. – Roberto

1
SELECT * 
FROM a 
JOIN b 
USING (bid) 
LEFT JOIN 
     с 
USING (cid) 
JOIN d 
ON  d.did = COALESCE(c.did, b.did) 
JOIN e 
USING (eid) 
WHERE e.name LIKE '%home%' 
+0

Ihre Antwort und Robertos Antwort funktionieren beide perfekt! Vielen Dank! – Jwags