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!
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!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 276879
Url: https://administrator.de/forum/update-auf-eine-spalte-in-zeilen-die-den-gleichen-wert-in-mehreren-anderen-spalten-enthalten-276879.html
Ausgedruckt am: 15.04.2025 um 19:04 Uhr
5 Kommentare
Neuester Kommentar
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:
Das funktioniert aber schonmal nicht in jedem SQL.
Welches DBMS setzt du ein?
Ich würde es bei einer Dublettensuche in etwa so machen:
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
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 )
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"?
Richtig, MySQL hat ein Problem mit Selbstreferenzierung, über Aliase geht es aber irgendwie, müsste ich raus suchen.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"?
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 nurdass alles was nicht x ist zu z wird, aber eben
nur wenn die werte der ersten drei Spalten identisch sind
1
UPDATE tabelle SET alles = 'z' WHERE alles <> 'x' AND spalte_1 = spalte_2 AND spalte_1 = spalte_3
Das kann sogar MySQL
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:
Die Performance würde vermutlich steigen wenn du einen Index auf a,b,c,pk hast.
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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
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.