2016-04-07 4 views
0

Ich habe zwei TabellenPostgres finden Tupeln von WHERE und COUNT von anderen Tisch

Tabelle ein
id
Titel
Jahr


Tabelle b
id
a.id verweist auf eine (ID)

Ich möchte Titel, Jahr und count() für alle Tupel mit max (Jahr) erhalten. Ich kann das nicht zur Arbeit bringen.

Ich kann sie getrennt, aber wenn ich eine WHERE-Klausel hinzufügen, schlägt es fehl.

select title, year, count(*) 
from a inner join b on a.id = b.a_id 
group by title, year 

So etwas würde mir Liste mit Titel Jahr und zählen. Wenn ich versuche, eine WHERE-Klausel hinzuzufügen

Hier bekomme ich kein Tupel. Ich glaube, ich verstehe fast, warum, aber ich kann es nicht lösen.

Hoffe jemand versteht mich und kann helfen!

+0

statt äußeren Versuchen zu verbinden. Mein Vorschlag ist, dass es keinen Eintrag in "b" gibt, der dem Eintrag von "a" mit maximalem Jahr entspricht. –

+0

Ich dachte, dass ich vielleicht auch Tuple verlieren würde und versuchte Outer Joins und es gibt mir 1 für jedes zurückgegebene Tupel. – CIsHard

Antwort

0

Wie wäre es damit?

WITH a_max_years AS (
    SELECT id 
    FROM a 
    WHERE year = (SELECT max(year) FROM a) 
) 
SELECT a.title, a.year, count(1) 
    FROM a 
    INNER JOIN b ON b.a_id = a.id 
    INNER JOIN a_max_years.id = a.id 
    GROUP BY b.a_id; 

oder:

WITH b_counts AS (
    SELECT a_id, count(1) as cnt 
    FROM b 
    GROUP BY a_id 
) 
SELECT a.title, a.year, b_counts.cnt 
    FROM a 
    INNER JOIN b_counts ON b_counts.a_id = a.id 
    WHERE a.year = (SELECT max(year) FROM a); 

Sie sie auch als INNER JOIN (SELECT ...) a_max_years schreiben könnte, aber WITH ist besser lesbar

+0

Mit Ihrer letzten Abfrage bekomme ich null Tupel mit der WHERE-Klausel. Ohne WHERE bekomme ich eine vollständige Liste mit Titel, Jahr und richtiger Zählung. Danke für die Eingabe! Vielleicht macht es mich hier etwas falsch. – CIsHard