1

Hier ist ein Auszug aus meinem Datenmodell (einschließlich eines Extrakts von Tabellen Inhalt).PostgreSQL: mehrere LINKE JOIN mit mehreren Bedingungen

enter image description here

Ich brauche die Anzahl der Operationen des Typs 1 über Jahr 2015. Ich mag auch die komplette Liste der Städte in meinem Ergebnis Compulse, nicht nur in der operation Tabelle verwiesen Städte (mit einer Anzahl gleich Null für Städte ohne registrierte Operationen). Ich muss dann mehrere Bedingungen angeben, aber die WHERE Klausel dreht meine LEFT JOIN in eine INNER JOIN (siehe this post), also muss ich die Bedingungen innerhalb der ON Klauseln angeben.

SELECT 
    town.town_code, 
    count(operation.*) AS nb 

FROM town 
    LEFT JOIN operation ON town.town_code = operation.ope_town AND operation.ope_year = 2015 
    LEFT JOIN intervention ON operation.ope_id = intervention.int_ope_id 
    LEFT JOIN nature ON intervention.int_id = nature.int_id AND nature.type_id = 1 

GROUP BY town.town_code ORDER BY town.town_code ; 

ich folgendes Ergebnis:

town_code | nb 
------------+----- 
86000  | 1 
86001  | 0 
86002  | 1 
86003  | 1 
86004  | 0 
86005  | 0 

Es gibt ein Problem mit der Stadt Code 86003, die 0. Diese Stadt Code bezieht sich auf eine Operation haben sollte (#5), die zu einer Intervention bezieht (#16) was sich auf eine nature type = 3 bezieht. Also eine der Bedingungen ist nicht erfüllt ...

Wie kann ich mit mehreren Bedingungen innerhalb ON Klauseln umgehen?


EDIT: Hier ist das Skript die Tabellen und Test zu erstellen.

CREATE TABLE town (town_code INTEGER, town_name CHARACTER VARING(255)) ; 
CREATE TABLE operation (ope_id INTEGER, ope_year INTEGER, ope_town INTEGER) ; 
CREATE TABLE intervention (int_id INTEGER, int_ope_id INTEGER) ; 
CREATE TABLE nature (int_id INTEGER, type_id INTEGER) ; 

INSERT INTO town VALUES (86000, 'Lille'), (86001, 'Paris'), (86002, 'Nantes'), (86003, 'Rennes'), (86004, 'Marseille'), (86005, 'Londres') ; 
INSERT INTO operation VALUES (1, 2014, 86000), (2, 2015, 86000), (3, 2012, 86001), (4, 2015, 86002), (5, 2015, 86003) ; 
INSERT INTO intervention VALUES (12, 1), (13, 2), (14, 3), (15, 4), (16, 5) ; 
INSERT INTO nature VALUES (12, 1), (13, 1), (14, 3), (15, 1), (16, 3) ; 
+0

wenn Sie Ihre tbables als Bild posten Sie machen es sehr schwer für jedermann zu beantworten. Wie soll jemand die Abfrage ausprobieren? – e4c5

+0

Habe gerade meinen Beitrag bearbeitet und das Skript hinzugefügt, um die Tabellen zu erstellen und zu testen, sorry. – wiltomap

Antwort

1

Es ist, weil Sie erste linke Join auswählen. Zum Beispiel können Sie verwenden:

SELECT t.town_code, count(j.*) AS nb FROM town t 
    LEFT JOIN (SELECT o.ope_town cd, o.ope_year yr FROM operation o, intervention i, nature n 
      WHERE o.ope_year = 2015 
      AND o.ope_id = i.int_ope_id AND n.type_id = 1 
      AND i.int_id = n.int_id) j 
      ON j.cd = t.town_code 
GROUP BY t.town_code ORDER BY t.town_code;