SQL: UPDATE von einem komplexen select

n einem Telefonsystem-Szenario habe ich 2 Tabelle

table1 besteht aus:customer_id, call_duration, calldate, skip_billing . table2 besteht aus:customer_id, bonus_seconds.

table1 speichert alle Anrufe für alle Kunden und table2 speichert die bonus_seconds, die die für einen bestimmten Kunden zulässige freie Gesprächszeit darstellen (dh: für Kunde 1 sind die ERSTEN 40 kumulierten Sekunden frei).

Ich muss eine Abfrage schreiben, um table1 gemäß der unten erläuterten Bedingung zu aktualisieren: setze skip_billing in Aufrufen, die in table2 frei definiert sind.

So muss ich zuerst nach customer_id gruppieren und dann die Aufrufe durchlaufen, indem ich eine kumulative Variable (cumsec) über call_duration inkrementiere und skip_billing entsprechend einstelle.

table1 Beispiel ist:

|sqlid |customer_id |billsec | skipbill|
|0     |1           |12      | 1       |<--need to set 1 due to cume=12 for customer_id=1
|1     |1           |10      | 1       |<--need to set 1 due to cume=22 for customer_id=1
|2     |1           |15      | 1       |<--need to set 1 due to cume=37 for customer_id=1
|3     |1           |8       | 0       |<--nop(no operation) due to cume=45
|4     |2           |12      | 1       |<--need to set 1 due to cume=12 for customer_id=2
|5     |3           |12      | 1       |<--need to set 1 due to cume=12 for customer_id=3
|6     |2           |12      | 0       |<--nop due to cume=24 for customer_id=2
|7     |1           |12      | 0       |<--nop due to cume=49 for customer_id=1
|8     |3           |15      | 0       |<--nop due to cumsec=27 for customer_id=3

|customer_id |bonus_seconds|
|1           |40           |
|2           |20           |
|3           |15           |

Ich habe es mit einer Abfrage wie dieser versucht (danke an Gordon Linoff), die den richtigen Zeilensatz zurückgibt:

    SELECT t.cume, t.calldate, t.customer_id FROM (SELECT t.*, (@cume := @cume + billsec) AS cume FROM table1 t CROSS JOIN (SELECT @cume := 0) vars ORDER BY calldate) t, table2 sct WHERE t.cume <= sct.bonus_seconds AND t.customer_id=sct.customer_id ;

Aber wenn ich versuche, mit dem UPDATE-Befehl wie unten zu arbeiten, funktioniert es nicht, weil es mit nichts übereinstimmt.

    UPDATE table1 SET skipbill=1 WHERE sqlid=(SELECT t.sqlid FROM (SELECT t.*, (@cume := @cume + billsec) AS cume FROM table1 t CROSS JOIN (SELECT @cume := 0) vars ORDER BY calldate) t, table2 sct WHERE t.cume <= sct.bonus_seconds AND t.customer_id=sct.customer_id ) ;

Wie kann ich die Update-Aufgabe mit dieser Abfrage oder etwas Besserem schreiben?

Danke im Vorau

Antworten auf die Frage(4)

Ihre Antwort auf die Frage