![]() |
Datenbank: Interbase • Version: 6.5 • Zugriff über: SQL
SQL Update alle Einträge
Hallo,
gibt es eine Möglichkeit mit einer UPDATE Anweisung alle Datensätze zu ändern ABER mit unterschiedlichen Werten für die einzelnen Datensätze? Struktur: Tab1 (pkey,reckey,sortstr) Tab2 (pkey,f1,f2,...fn) Tab1.reckey=Tab2.pkey Es kann mehrere Datensätze in Tab1 geben die den gleichen reckey haben! Was gemacht werden soll: Tab1.sortstr soll aktualisiert werden. Dabei entspricht Tab1.sortstr=concat(tab2.f5+tab2.f1+...) Wie bekomme ich das mit einem SQL-Statement hin ohne alle Datensätze in Tab2 durchlaufen zu müssen? Hat jemand einen Tipp? |
AW: SQL Update alle Einträge
Und wie unterscheiden sich die Werte? Ist der neue Wert berechenbar?
|
AW: SQL Update alle Einträge
Zitat:
|
AW: SQL Update alle Einträge
Dann sind sie ja "berechenbar/ermittelbar"
|
AW: SQL Update alle Einträge
Falls ich Dich richtig verstanden habe kannst Du es mal so versuchen:
SQL-Code:
UPDATE Tab1
SET sortstr = ( SELECT Tab2.f5 || Tab2.f1 || ... FROM Tab2 WHERE Tab2.pkey = Tab1.reckey) |
AW: SQL Update alle Einträge
also mit
Code:
erhalte ich die richtige Ergebnismenge aber leider meckert interbase beim update mit "multiple rows in singleton select"
select (tab2.f2||tab3.fx ...)
from tab1 left outer join tab2 an (tab1.reckey=tab2.pkey) |
AW: SQL Update alle Einträge
Der Subquery liefert mehrere Ergebniszeilen; du musst diesen so anpassen, dass genau ein Ergebnis rauskommt.
|
AW: SQL Update alle Einträge
Dann habe ich die Master-Detail-Beziehung doch falsch verstanden (oder sie war falsch geschildert).
|
AW: SQL Update alle Einträge
Zitat:
|
AW: SQL Update alle Einträge
Er meint je zu aktualisierendem Datensatz ein Datensatz aus der Subquery. Im Moment kommen in Letzterer noch mehrere, da musst Du die Kriterien anpassen, damit nur der eine passende kommt.
|
AW: SQL Update alle Einträge
Zitat:
|
AW: SQL Update alle Einträge
Ja, die Du updaten willst. Das geht mit der Subquery aber nur, wenn diese genau einen Datensatz liefert.
|
AW: SQL Update alle Einträge
Der SubQuery wird ja einmal pro Datensatz ausgeführt, und muss dann das Ergebnis für diesen Datensatz liefern
|
AW: SQL Update alle Einträge
Zitat:
|
AW: SQL Update alle Einträge
Zitat:
|
AW: SQL Update alle Einträge
Z.B. wenn du ein Alias setzt
SQL-Code:
UPDATE Tab1 t
SET t.sortstr = ( SELECT t2.<Feld aus Tab2> FROM Tab2 t2 WHERE t2.pkey = t.reckey); |
AW: SQL Update alle Einträge
Und das ist jetzt fast genau wieder mein Statement aus #5, nur mit Alias und umgedrehten Tabellen :mrgreen:
|
AW: SQL Update alle Einträge
Zitat:
ja danke so klappt es.... |
AW: SQL Update alle Einträge
das ist leider zu langsam.....
Gibt es eine Möglichkeit die ganze Ergebnismenge des Select-Statements auf einmal in eine vor selektierte Zieltabelle zu schreiben? |
AW: SQL Update alle Einträge
Hi,
ab Firebird 2.1 gibt es dafür
SQL-Code:
aber ob Interbase 6.5 das kann weis ich nicht.
MERGE INTO ..
alex Edit: [OffTopic] kann mir jemand sagen wo ich die SQL-Tags finde? [/OffTopic] |
AW: SQL Update alle Einträge
[ code=SQL ] (ohne Leerzeichen natürlich)
|
AW: SQL Update alle Einträge
Zitat:
Aber im Moment stelle ich mich noch zu blöd an (siehe #20), aber vllt. lern ich's ja noch. |
AW: SQL Update alle Einträge
SQL-Code:
gab es nur in der alpha
MERGE
Und wurde später durch
SQL-Code:
ersetzt
Update or Insert
SQL-Code:
Der SQL-Tag ist eine Erweiterung des Code-Tags; diesen einfach um =SQL erweitern
Update Or Insert into <Tabelle> (<Feldliste>)
values ( <Werteliste> ) matching (<Feldliste übereinstimmnde Felder>); |
AW: SQL Update alle Einträge
Zitat:
SQL-Code:
um einiges mächtiger als das
MERGE INTO..
SQL-Code:
.
Update or Insert
wobei beide ihre Berechtigung haben. Aber ich glaube das ist auch schon Off Topic Zitat:
Aber jetzt hab ich's begriffen. |
AW: SQL Update alle Einträge
Und was war am
SQL-Code:
mächtiger?
MERGE
|
AW: SQL Update alle Einträge
Zitat:
Bsp. aus der Firebird.Docs:
SQL-Code:
Beim "UPDATE OR INSERT" werden IMMER entwerder INSERT oder UPDATE ausgeführt.
MERGE
INTO customers c USING (SELECT * FROM customers_delta WHERE id > 10) cd ON (c.id = cd.id) WHEN MATCHED THEN UPDATE SET name = cd.name WHEN NOT MATCHED THEN INSERT (id, name) VALUES (cd.id, cd.name) Dabei werden beim INSERT und UPDATE die GLEICHEN Felder eingefügt/geändert. Beim Merge hat man die Möglichkeit beim Update andere Felder als beim Insert zu setzen. Und man kann eine von beiden Operationen wegzulassen. Um wieder zu Thema "SQL Update alle Einträge" zurückzukehren: In diesem Fall, es fände nur der
SQL-Code:
-Zweig
..WHEN MATCHED THEN UPDATE SET ..
Verwendung,
SQL-Code:
würde man weglassen.
..WHEN NOT MATCHED THEN INSERT ..
Ein Geschwindigkeitsvorteil gegenüber einem einfachen "UPDATE .. SET = (Select.. From..)" ergibt sich wenn mehrer Felder der Zieltabelle aus gleichzeitig geändert werden.
SQL-Code:
MERGE INTO customers c USING (SELECT * FROM customers_delta WHERE id > 10) cd ON (c.id = cd.id) WHEN MATCHED THEN UPDATE SET name = cd.name, FeldX = cd.ZZ, FeldY = cd.TTT; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz