2016-07-20 4 views
0

Ich habe 4 Tabellen, denen ich beitreten möchte, um die notwendigen Daten in ihnen zu bekommen.Wie verwende ich den linken äußeren Join nach dem linken Join für diese Tabellen?

Tabelle A.

id | name | deleted | amount | due_date | status 
1 | a | 0  | 10  | 2016-07-18 | Unpaid 
2 | b | 0  | 20  | 2016-07-19 | Unpaid 
3 | c | 0  | 15  | 2016-07-18 | Unpaid 

Tabelle B

id | name | due_date | status 
1 | a  |   | Unpaid 
2 | b  |   | Unpaid 
3 | c  |   | Unpaid 
4 | d  | 2016-07-19 | Unpaid 

Tabelle C

id | table_d_id | table_a_id 
1 | 1   | 1 
2 | 2   | 2 
3 | 3   | 3 

Tabelle D

id | 
1 
2 
3 

Was ich will, hier zu tun ist, um die Daten in Tabelle B mit DUE_DATE abzurufen und einer unbezahlten Status, und dass es nicht in Tabelle A gefunden

Meine aktuelle Abfrage:

SELECT A.*, B.*, C.*, D.* 
FROM A 
LEFT OUTER JOIN B ON B.name= A.name 
INNER JOIN C ON A.id = C.id 
INNER JOIN D ON C.id = D.id 
WHERE A.deleted=0 AND ((B.due_date < "2016-07-20" AND B.status = "Unpaid") OR (A.due_date < "2016-07-20" AND A.status = "Unpaid")) 
GROUP BY D.id 

Was diese Abfrage derzeit tut, ist, dass es nur die Daten in den Tabellen mit Ausnahme von ID 4 bei Tabelle B erhält, die ich auch abrufen wollte, da es einen unbezahlten Status hat.

+0

Das erste, was LEFT JOIN und LEFT OUTER JOIN beide gleich sind –

+0

@DhavalBhavsar ich nicht wusste, dass ich google gerade überprüft und sah, dass OUTER alles aus beiden Tabellen bekommen verbindet. – hungrykoala

Antwort

1

sollten Sie verwenden LEFT JOIN (und Sie die b.column Probe ist der Name nicht die Nummer ..)

SELECT A.*, B.*, C.*, D.* 
FROM B 
LEFT JOIN A_cstm ON A.id = A_cstm.id_c 
LEFT JOIN A ON B.name = A.name 
INNER JOIN C ON A.id = C.id 
INNER JOIN D ON C.id = D.id 
WHERE A.deleted=0 AND ((B.due_date < "2016-07-20" AND B.status = "Unpaid") OR (A.due_date < "2016-07-20" AND A.status = "Unpaid")) 
GROUP BY D.id 

Die Tabelle A_cstm ist nicht in Ihnen Modell beschrieben (i für Klarheit entfernt worden ..) und ich habe die Reihenfolge der th Wechsel von B join verwenden und A statt Ihrer .. FROM A verbinden links B links

SELECT A.*, B.*, C.*, D.* 
FROM B 
LEFT JOIN A ON B.name = A.name 
INNER JOIN C ON A.id = C.id 
INNER JOIN D ON C.id = D.id 
WHERE A.deleted=0 AND ((B.due_date < "2016-07-20" AND B.status = "Unpaid") OR (A.due_date < "2016-07-20" AND A.status = "Unpaid")) 
GROUP BY D.id  
+0

Bearbeitet, um den Fehler zu beheben, aber nach dem Ausprobieren der Abfrage erhält es immer noch nicht das vierte Element bei Tabelle B – hungrykoala

+0

Ich habe update die anser .. mit einigen Vorschlägen .. hoffe nützlich – scaisEdge

+0

Gibt es keine andere Möglichkeit, dies ohne zu ändern die FROM seit, ich kann diesen Teil nicht ändern, ich kann nur Join-Anweisungen hinzufügen. – hungrykoala

1

Bitte verwenden Sie unter Abfrage

SELECT A.*, B.*, C.*, D.* 
FROM A 
LEFT JOIN A_cstm ON A.id = A_cstm.id_c 
LEFT JOIN B ON B.number = A.name 
INNER JOIN C ON A_cstm.id_c = C.id 
INNER JOIN D ON C.table_d_id = D.id 
WHERE A.deleted=0 AND ((B.due_date < "2016-07-20" AND B.status = "Unpaid") OR (A.due_date < "2016-07-20" AND A.status = "Unpaid")) 
GROUP BY D.id 
beitreten
+0

Es wird immer noch nicht das vierte Element der Tabelle B bekommen – hungrykoala

+0

Jetzt überprüfen Sie bitte ich bin aktualisierte Abfrage –

+0

ist es Arbeit oder nicht? –

0

Try this:

SELECT A.*, B.*, C.*, D.* 
FROM B 
LEFT OUTER JOIN A ON A.name= B.name 
LEFT OUTER JOIN C ON C.id = B.id 
LEFT OUTER JOIN D ON D.id = B.id 
WHERE A.deleted=0 AND ((B.due_date < "2016-07-20" AND B.status = "Unpaid") OR (A.due_date < "2016-07-20" AND A.status = "Unpaid")) 
GROUP BY D.id 
+0

Ich kann die FROM A nicht von FROM B ändern. Also brauche ich eine Lösung mit FROM A – hungrykoala

Verwandte Themen