2016-08-09 1 views
0

Ich nehme an, die Antwort ist nein, aber immer daran interessiert, etwas Neues zu lernen. Hier ist das Setup; Ich habe drei Tabellen, container_location, container_location_size und container. Ja, es gibt auch eine Standorttabelle, aber ich glaube nicht, dass ich sie hier brauche. Container_location ist eine Join-Tabelle, die die Container auflistet, die sich an einem bestimmten Speicherort befinden. Die Containertabelle beschreibt die Merkmale für einen bestimmten Container. Die container_location_size beschreibt, wie Container an einem Ort platziert werden können. Ich kann die Anzahl der Behälter für einen bestimmten Standort mit diesem SQL erhalten:Gibt es eine Möglichkeit, die Ergebnisse einer Abfrage zu filtern, indem Sie den Wert einer Aggregatfunktion mit einer Spalte vergleichen, die nicht in GROUP BY enthalten ist?

SELECT location_code, 
     COUNT(*) AS container_count 
    FROM container_location 
GROUP BY location_code 

Die Frage, die ich zu beantworten versuche ist, welche Orte voll sind (dh sie haben eine Anzahl von Behältern gleich oder größer als der max .. für diesen Standort Die container_location_size Tabelle eine Spalte max_containers hat, wie viele Behälter gibt an dieser Stelle sein kann, ich habe mit diesem SQL kommen diese Frage zu beantworten:

SELECT container_location_size.location_code 
    FROM container_location_size 
    JOIN (SELECT location_code, 
       COUNT(*) AS container_count 
      FROM container_location 
     GROUP BY location_code) AS contcount 
    ON contcount.location_code = container_location_size.location_code 
WHERE contcount.container_count >= container_location_size.max_containers 

Das funktioniert aber ich frage mich, ob dies kann Als Problem habe ich festgestellt, dass HAVING erfordert, dass jede Spalte verglichen wird in der GROUP BY. Ich möchte natürlich nicht nach der maximalen Anzahl von Containern gruppieren. Wie ich zu Beginn gesagt habe, erwarte ich, dass dies keine lösbaren Probleme sind, aber ich bin daran interessiert, entweder falsch bewiesen zu werden, oder alternative Ansätze.

+0

Fügen Sie einfach 'max_containers' hinzu? – Blorgbeard

+0

Wie ich in der Frage gesagt habe, führt dies zu einer falschen Zählung der Container nach Standort. Das "reale" Schema hat mehr als einen möglichen Maximalcontainer, da unterschiedliche Container unterschiedliche Größen haben. Ich habe ein vereinfachtes Beispiel verwendet, vielleicht habe ich das Beispiel vereinfacht. –

+0

Ich sehe nicht, wo Sie das in der Frage gesagt haben .. Ich denke, dass Sie in der Tat zu stark vereinfacht haben. Gibt es mehrere Zeilen in 'location' mit demselben' location_code', aber anderen 'max_containers' Werten? – Blorgbeard

Antwort

1

Sie können dies als schreiben:

SELECT l.location_code, COUNT(*) AS container_count 
FROM container_location cl JOIN 
    location l 
    ON l.location_code = cl.location_code 
GROUP BY l.location_code 
HAVING COUNT(*) >= MAX(l.max_containers); 

Hinweise:

  • Dies setzt voraus, dass location(location_code) einzigartig ist. Das scheint vernünftig.
  • Die HAVING Klausel verwendet MAX(l.max_containers). Die Spalte muss in einer Aggregatfunktion sein. Eine Alternative wäre, l.max_containers in die GROUP BY einzuschließen.
  • Dies ist möglicherweise nicht viel schneller als Ihre Version.
+0

Da ich die Frage geändert habe, werde ich Ihre Antwort den letzten Schritt nehmen. container_location_size (location_code) ist nicht eindeutig, aber container_location_size (location_code, container_size) ist das. Der Trick über MAX hat mich übertrieben, danke. –

+0

Für Interessenten ist dies die SQL ich am Ende mit: SELECT 'FULL' Als Belegung, \t \t COUNT (*) als container_count VON Standort loc \t container_location CONLOC JOIN ON conloc.location_code = loc.location_code JOIN Behälter con \t ON con.container_code = conloc.container_code JOIN container_and_location_size coanls coanls.location_size_code ON = loc.location_size_code UND coanls.container_size_code con.container_size_code = HAVING COUNT (*)> = MAX (coanls.max_number_ of_containers) –

Verwandte Themen