rohann
Goto Top

Update auf eine Spalte in Zeilen, die den gleichen wert in mehreren anderen Spalten enthalten

Hallo Leute!
Vermutlich ein leichter Griff für geübte SQLer, aber ich komme gerade nicht richtig weiter...vielleicht ist das so auch gar nicht machbar, wie ich es mir vorstelle


Ziel ist es in einer Tabelle, in Zeilen die in mehreren Spalten - sagen wir 3, den gleichen Wert enthalten eine vierte spalte auf einen gewünschten Wert zu setzen

Z.B diese zwei Zeilen, jede Zahl steht für eine Spalte - durch einen Vergleich die Gleichheit der vorderen drei Spalten erkennen und "y" auf einen beliebigen Wert - !="x" sondern "z" setzen

| 45 | 23 | 75 | x |
| 45 | 23 | 75 | y |


Danke im Voraus!

Content-Key: 276879

Url: https://administrator.de/contentid/276879

Printed on: April 24, 2024 at 11:04 o'clock

Member: ukulele-7
ukulele-7 Jul 09, 2015 at 12:44:55 (UTC)
Goto Top
Du möchstest den Wert also nicht abhängig von anderen Werten in der selben Spalte sondern abhängig von "gleichen" Werten in einem anderen Datensatz setzen? Möchtest du auf Dubletten prüfen oder steckt da noch mehr Mathematik hinter?

Welches DBMS setzt du ein?

Ich würde es bei einer Dublettensuche in etwa so machen:
UPDATE	tabelle
SET		ergebnis = 'z'  
WHERE EXISTS (	SELECT	1
				FROM	tabelle t
				WHERE	t.spalte_1 = tabelle.spalte_1
				AND		t.spalte_2 = tabelle.spalte_2
				AND		t.spalte_3 = tabelle.spalte_3
				AND		t.pk != tabelle.pk )
Das funktioniert aber schonmal nicht in jedem SQL.
Member: rohann
rohann Jul 09, 2015 updated at 14:09:32 (UTC)
Goto Top
Danke für die Antwort!
Entschuldige, MySQL...Prinzipiell liest sich der code den du da geschrieben hast nach dem, was ich mir vorstellte...aber mySQL ist vermutlich ein Kandidat fürs "nicht in jedem"? face-smile

Mathematik gibt es dahinter nicht, es ist eine reine Vorgabe und soll erreichen, dass alles was nicht x ist zu z wird, aber eben nur wenn die werte der ersten drei Spalten identisch sind
Member: ukulele-7
ukulele-7 Jul 09, 2015 updated at 14:21:39 (UTC)
Goto Top
Zitat von @rohann:
Entschuldige, MySQL...Prinzipiell liest sich der code den du da geschrieben hast nach dem, was ich mir vorstellte...aber mySQL ist
vermutlich ein Kandidat fürs "nicht in jedem"? face-smile
Richtig, MySQL hat ein Problem mit Selbstreferenzierung, über Aliase geht es aber irgendwie, müsste ich raus suchen.

Mir ist aber noch nicht ganz klar was dein Ziel ist:
Zitat von @rohann:
dass alles was nicht x ist zu z wird, aber eben
nur wenn die werte der ersten drei Spalten identisch sind
Das wäre einfach nur
UPDATE tabelle SET alles = 'z' WHERE alles <> 'x' AND spalte_1 = spalte_2 AND spalte_1 = spalte_3  
Ich glaube aber nicht das du das meinst.

Das kann sogar MySQL
Member: rohann
rohann Jul 09, 2015 updated at 14:45:38 (UTC)
Goto Top
Habe mich blöd ausgedrückt -- > nur wenn die werte der ersten drei Spalten identisch sind
Ich meine, wenn die Werte der "Spalten der Zeilen" identisch sind (z1.a = z2.a, z1b = z2.b, z1c = z2.c)

Wie oben aufgeführt:

a b c d
45 23 75 x
45 23 75 y

Also schon etwa das, was du oben aufgeführt hast. Die Sache ist noch: Die Tabelle hat ca. 115.000.000 Zeilen
Member: ukulele-7
ukulele-7 Jul 10, 2015 at 06:43:12 (UTC)
Goto Top
Das hatte ich mir auch so gedacht nur deine Beschreibung passte nicht ganz.

So wie ich das sehe muss man unter MySQL, um die Selbstreferenzierung auszutricksen, einen weiteren Tabellen-Alias einbauen. Ich kann das nicht testen und weiß nicht mal, warum das von MySQL überhaupt so problematisch gesehen wird. Daher rate ich dir dringend erstmal nur Testspalten auf einer TestDB zu aktualisieren, probieren kannst du das mal hiermit:
UPDATE	tabelle 
SET	d = 'z'   
WHERE	d <> 'x'  
AND	EXISTS (

SELECT	t.z
FROM	(	SELECT	1 AS z
		FROM	tabelle t 
		WHERE	t.a = tabelle.a 
		AND		t.b = tabelle.b 
		AND		t.c = tabelle.c
		AND		t.pk != tabelle.pk ) t

)

Die Performance würde vermutlich steigen wenn du einen Index auf a,b,c,pk hast.