Andreas Kretschmer akretschmer@spamfence.net wrote:
Zuerst das WHERE. Wenn mich nur die 16 Uhr Einträge interessieren:
with move as (delete from acct where date_trunc('hour',stamp_inserted) = '2014-12-23 16:00:00' returning *) select mac_src, mac_dst, ip_src, ip_dst, port_src, port_dst, ip_proto, sum(packets), sum(bytes), date_trunc('hour',stamp_inserted) from acct where date_trunc('hour',stamp_inserted) = '2014-12-23 16:00:00' group by mac_src, mac_dst, ip_src, ip_dst, port_src, port_dst, ip_proto, date_trunc('hour',stamp_inserted);
sorry, das war mein Fehler. Das mit der WITH - Syntax geht so:
with xxx as (... returning *) select ... from xxx
Ich hatte, das war mein Fehler, den Du brav übernommen hast, im select wieder die originale Tabelle, nicht das, was via WITH xxx in der nun temp. Tabelle xxx steht. Siehst noch durch?
Passiert halt, wenn es schnell gehen soll...
Du kannst auch solche Dinge damit machen:
with x1 as (select ....), x2 as (delete from ... returning *), x3 as (update ... ) select * from x1 left join x2 on ... left join x3 on ...
Oder, was auch sehr nützlich ist, bei Inserts in Tabellen, wo ein Key generiert wird, den Du im zweiten Insert dann brauchst. Läßt sich so alles in einem Befehl schreiben, damit nur ein mal Applikation -> DB, nur ein mal für die DB einen Plan erstellen etc. kann durchaus Performance bringen.
Andreas