Update von 3 Feldern gleichzeitig

Also, ich habe mal die Tabellen aufgrund deines Eingangspostings erstellt und abgefüllt.

Dann mein SQL getestet, alle Fehler behoben und bin daraufhin auf das unten stehende SQL gekommen.

Das Resultat sieht dann so aus
BU FSDD_VALUE_ID_1 FSDD_KPI_LEVEL_ID FSDD_KPI_LEVEL_NAME FSDD_KPI_TARGET
710000 16 15 High 14


SQL:
Update 
	f_sd_detail,
	(SELECT
		BU,
		ELT(pos+1, 'NV', Value_level_3_name, Value_level_2_name, Value_level_1_name) AS level_name,
		ELT(pos, Value_level_3_ID, Value_level_2_ID, Value_level_1_ID) AS level_id	,
		VALUE_LEVEL_KPI_TARGET
	FROM
		(SELECT DISTINCT
			p.*,
			INTERVAL(d.FSDD_VALUE_ID_1, p.Value_level_3_ID, p.Value_level_2_ID, p.Value_level_1_ID) AS pos
		FROM
			f_sd_detail AS d,
			parametertabelle AS p
		WHERE
			d.bu = p.bu
		) AS position
	) AS newValues
SET
	FSDD_KPI_LEVEL_NAME = newValues.level_name,
	FSDD_KPI_LEVEL_ID = newValues.level_id,
	FSDD_KPI_TARGET = newValues.VALUE_LEVEL_KPI_TARGET
WHERE
	newValues.BU = f_sd_detail.BU

Es ist nicht wirklich kompliziert
INTERVAL: http://dev.mysql.com/doc/refman/5.1/de/comparison-operators.html ->INTERVAL()
gibt die Position zurück.

ELT: http://dev.mysql.com/doc/refman/5.1/de/string-functions.html _> ELT()
nimmt anhand eines Index einen Wert aus einer Liste

Zuerst bestimme ich an die Position innerhlab der Auflistung
SQL:
INTERVAL(d.FSDD_VALUE_ID_1, p.Value_level_3_ID, p.Value_level_2_ID, p.Value_level_1_ID) AS pos
Ich beginne extra mit Level 3, da die Werte aufsteigend sein müssen und bei dir sind sie absteigend.

Anschliessend gehe ich mit dieser Position in die Auflistung zurück um den Wert auszulesen
SQL:
ELT(pos, Value_level_3_ID, Value_level_2_ID, Value_level_1_ID) AS level_id

Da 0 auch hier 0 zurückgibt, muss ich nix spezielles machen um die 'NV'-ID zu evaluieren.
Beim Text sieht es anders aus. Da schiebe ich ein 'NV' vorne rein und versetze dementsprechend die position um 1. Wenn der Wert 0 ist, nimmt er mir so den ersten Wert, also 'NV'.
SQL:
ELT(pos+1, 'NV', Value_level_3_name, Value_level_2_name, Value_level_1_name) AS level_name

Dann das alles als noch mit der Update-Tabelle verknüpfen und die SET richtig schreiben. Fertig ist der Zauber.
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

also wenn ich das Script ausführe bekomme ich die meldung
Schlüsselwort SET fehlt.

UPDATE
f_sd_detail,
(SELECT
BU,
ELT(pos+1, 'NV', Value_level_3_name, Value_level_2_name, Value_level_1_name) AS level_name,
ELT(pos, Value_level_3_ID, Value_level_2_ID, Value_level_1_ID) AS level_id ,
VALUE_LEVEL_KPI_TARGET
FROM
(SELECT DISTINCT
p.*,
INTERVAL(d.FSDD_VALUE_ID_1, p.Value_level_3_ID, p.Value_level_2_ID, p.Value_level_1_ID) AS pos
FROM
f_sd_detail AS d,
parametertabelle AS p
WHERE
d.bu = p.bu
) AS position
) AS newValues
SET FSDD_KPI_LEVEL_NAME = newValues.level_name,
FSDD_KPI_LEVEL_ID = newValues.level_id,
FSDD_KPI_TARGET = newValues.VALUE_LEVEL_KPI_TARGET
WHERE
newValues.BU = f_sd_detail.BU
 
Item: Ich lese keinen Code mehr, der nicht formatiert und mindestens in [ CODE ]..[ /CODE ] (besser noch den Tag der jeweiligen Sprache) gesetzt ist
Item: Formatiert den Code (auch SQL-Statements) sauber - dann kann man ihn auch lesen
Bitte, hilf uns wenn wir dir helfen sollen

PS: Es währe auch mal an der Zeit um mir zu bestätigen, ob du wirklich mit MySQL arbeitest...
 
Ich schau mich mal morgen in meinen Oracle-Bücher um. Mit ORACLE sollte es glaub noch einfacher gehen...

Bin nur nicht mehr so geübt drin *g*
 
Zurück