2017-07-05 2 views
0

Ich habe Kunden- und Anwendungstabellen. Ich möchte eine Auswahlabfrage erstellen, die Informationen über einen Kunden liefert und auch eine Anzahl von Anwendungen zählt, die der Benutzer im System hat.Wie zwei abhängige Tabellen zu kleben?

select distinct c.id, c.region, c.city, count(a.customer_id_id) 
from customers c 
join applications a on c.id=a.customer_id_id 
group by c.id; 

Aber ich erhalte eine Fehlermeldung, die ich von Region und Stadt zu einer Gruppe benötigen, aber ich möchte Informationen über jede Anwendung angezeigt wird nicht zu einer Gruppe von Region und Stadt. Weil ich auf diese Weise nicht für jeden Benutzer eine Reihe von Anwendungen bekomme, sondern für jede Benutzergruppe. Ich lese, dass es möglich ist, mit verschachtelten Abfragen und voller Outer Join zu tun, aber ich habe es versucht und es hat nicht funktioniert. Kannst du mir erklären, wie das geht?

Antwort

1

Sie sind in der Nähe.

  1. Verwenden Sie ein LEFT OUTER JOIN so dass Customers mit 0 Datensätze in Applications auch (vorausgesetzt, Ihre Absicht hier)

  2. nicht DISTINCT und GROUP BY zusammen verwenden aufgenommen werden Sie. Distinct bedeutet "Wenn alle Felder den gleichen Wert über mehrere Datensätze in der Datensatzgruppe haben, die von dieser SELECT-Anweisung erzeugt wird, dann geben Sie nur eindeutige Datensätze zurück und löschen die Duplikate". Stattdessen mit GROUP BY, "Gruppieren von dieser Liste von Feldern. Alle verbleibenden Felder, die nicht in dieser Liste sind, werden mit einer Formel in Ihrer SELECT-Klausel wie count(a.customer_id_id) zusammengefasst." Sie sind ähnlich, aber Sie können ein Feld nicht nur mit einem DISTINCT aggregieren.

  3. Wenn GROUP BY verwenden, wenn Sie nicht durch ein Feld mit einer Aggregations Formel (count, sum, avg, etc ..), dann sind Sie müssen es in Ihrer Gruppe aggregieren werden. Dies ist bei einigen RDBMS (älteren Versionen von MySQL zum Beispiel) nicht notwendig, aber es ist eine schlechte Übung, da ein Feld, das nicht explizit mit einer Formel aggregiert ist, die auch in GROUP BY fehlt, wie das RDBMS sagt "Wählen Sie einfach welche auch immer Wert, den Sie von übereinstimmenden Datensätzen wünschen ", die einige unerwartete Folgen haben könnten.


SELECT c.id, c.region, c.city, count(a.customer_id_id) 
FROM customers c 
    LEFT OUTER JOIN applications a on c.id=a.customer_id_id 
GROUP BY c.id, c.region, c.city; 
0

nicht sicher, was das Problem ist. Ich nehme an, dass Region und Stadt funktional von ID abhängig sind (das ist ID ist ein Kandidatenschlüssel). Neuere Versionen von postgresql akzeptieren daher Ihre Anfrage. Wenn Sie jedoch auf einer älteren Version sind, können Sie Ihre Gruppe von Klausel erweitern:

select c.id, c.region, c.city, count(a.customer_id_id) 
from customers c 
join applications a 
    on c.id=a.customer_id_id 
group by c.id, c.region, c.city; 

Sie sagen, dass Sie Informationen über jede Anwendung anzeigen möchten, aber warum zählen Sie dann die Anzahl der Anwendungen pro Kunde? Meinst du etwas wie:

select c.id, c.region, c.city, a.customer_id_id, a.<other attributes> 
from customers c 
join applications a 
    on c.id=a.customer_id_id;