2017-01-17 1 views
0

ich Postgres 9.4Einstellung muliple Reihen in Postgres basierend auf den eingestellten Werten der vorherigen Postgres Reihen

läuft Ich bin im Wesentlichen eine vorhandene unorganisierte Struktur in einen Ordner basierten Organisation zu aktualisieren. Ich ordne jedem Element automatisch eine Bestellnummer für die Neuordnung des Benutzers zu, führe aber eine Anfangseinstellung aller dieser Werte mit einer Aktualisierungsanweisung mit einem Zeitaufwand durch. Es scheint jedoch, als ob SET die Klausel from von der Unterabfrage übernimmt und sie nicht für jede nachfolgende Zeile neu erstellt, die sie setzt.

Hier ist meine Abfrage Beispiel:

UPDATE folder_items 
SET order_number = 
(SELECT COALESCE(MAX(folder_items_2.order_number), 0) + 1 
FROM folder_items AS folder_items_2 
WHERE folder_items.parent_folder_id = folder_items_2.parent_folder_id 
AND folder_items.folder_set_id = folder_items_2.folder_set_id 
AND folder_items.id != folder_items_2.id); 

Mit meiner ersten Tabelle:

  | folder_id | folder_set_id | order_number 
row 1 | 1   | 1    | null 
row 2 | 2   | 1    | null 
row 3 | 3   | 2    | null 
row 4 | 4   | 2    | null 
row 5 | 5   | 2    | null 
row 6 | 6   | 3    | null 

, wenn ich meine Abfrage ausführen ich so etwas wie

  | folder_id | folder_set_id | order_number 
row 1 | 1   | 1    | 1 
row 2 | 2   | 1    | 1 
row 3 | 3   | 2    | 1 
row 4 | 4   | 2    | 1 
row 5 | 5   | 2    | 1 
row 6 | 6   | 3    | 1 

Allerdings möchte ich die Ergebnisse, dass wie folgt aussehen:

  | folder_id | folder_set_id | order_number 
row 1 | 1   | 1    | 1 
row 2 | 2   | 1    | 2 
row 3 | 3   | 2    | 1 
row 4 | 4   | 2    | 2 
row 5 | 5   | 2    | 3 
row 6 | 6   | 3    | 1 

Gibt es eine Möglichkeit, diese gewünschten Ergebnisse zu erhalten? Ist der beste Weg, um eine Art von Fensterfunktion zu machen, die zählt, wie viele in der gleichen folder_set_id unter jeder Zeile sind?

+0

Das Problem ist, dass Sie das Update denken instanly reflektiert werden, aber das stimmt nur aktualisiert, wenn die Abfrage Ende, so dass jeder sein Wenn Sie anrufen, wird die Originalversion angezeigt. –

+0

Ich sehe! Gibt es eine Möglichkeit, meine gewünschte Ausgabe zu machen? –

+0

Oder muss ich etwas tun, um sie alle numerisch zu ordnen, und dann subtrahieren Sie durch die Anzahl der nicht-Ordner-Set-Elemente in dem Fenster darunter? –

Antwort

1

Verwenden Sie ROW_NUMBER, um die ORDER_ID zu berechnen, aktualisieren Sie dann die Tabelle.

with new_order as (
     SELECT "folder_id", 
       row_number() over (partition by "folder_set_id" 
            order by "folder_id") as rn 
     FROM Table1 
) 
UPDATE Table1 AS t 
SET "order_number" = n.rn 
FROM new_order AS n 
WHERE t."folder_id" = n."folder_id"; 

SQL DEMO

OUTPUT

| row_id | folder_id | folder_set_id | order_number | 
|--------|-----------|---------------|--------------| 
| row 1 |   1 |    1 |   1 | 
| row 2 |   2 |    1 |   2 | 
| row 3 |   3 |    2 |   1 | 
| row 4 |   4 |    2 |   2 | 
| row 5 |   5 |    2 |   3 | 
| row 6 |   6 |    3 |   1 | 
Verwandte Themen