Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Mehrfach Update STatement (https://www.delphipraxis.net/201259-mehrfach-update-statement.html)

hoika 5. Jul 2019 15:08

AW: Mehrfach Update STatement
 
Hallo,
was ist, wenn keines deiner 3 when zuschlägt.
Ich bin der Meinung, dass eine else fehlt.
Dein Feld sequenze ist doch bestimmt als not null gekennzeichnet oder ?

Ykcim 5. Jul 2019 15:11

AW: Mehrfach Update STatement
 
Ja, das Feld ist als not null definiert. Aber die Abfrage müsste Matchen, so dass mir ein Else vielleicht die Fehlermeldung eliminieret, aber mir nicht das Update durchführt…

Ykcim 5. Jul 2019 15:19

AW: Mehrfach Update STatement
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ich habe jetzt ein Else eingebaut und es hat einen Teilerfolg gebracht:
Delphi-Quellcode:
update as400 set
  sequence = case
      when (concat(waaunr,'-',waaupo) ='408216-0' and oaagnr =20) then 1
      when (concat(waaunr,'-',waaupo) ='408217-0' and oaagnr =20) then 2
      when (concat(waaunr,'-',waaupo) ='408218-0' and oaagnr =20) then 3
      else 0
  end,
  frozen = case
      when (concat(waaunr,'-',waaupo) ='408216-0' and oaagnr =20) then 1
      when (concat(waaunr,'-',waaupo) ='408217-0' and oaagnr =20) then 1
      when (concat(waaunr,'-',waaupo) ='408218-0' and oaagnr =20) then 0
      else 0
  end,
  plan_date = case
      when (concat(waaunr,'-',waaupo) ='408216-0' and oaagnr =20) then '2019-07-05'
      when (concat(waaunr,'-',waaupo) ='408217-0' and oaagnr =20) then '2019-07-05'
      when (concat(waaunr,'-',waaupo) ='408218-0' and oaagnr =20) then '2019-07-06'
      else '000-00-00'
  end
where concat(waaunr,'-',waaupo) in ('408216-0', '408217-0', '408218-0')
Jetzt wird tatsächlich die Daten eingetragen, aber bei allen anderen Arbeitsgängen (nach 10 kommt 20, 30 usw) greift dann das ELSE.

das bedeutet, dass die vorhergehenden Daten, die unangetastet bleiben sollen, mit dem ELSE überschrieben werden...

Ich habe es in zwei Screenshots dargestellt...

Ykcim 5. Jul 2019 15:32

AW: Mehrfach Update STatement
 
Vielleicht habe ich eine Möglichkeit gefunden, wie ich das Problem umgehen kann. Ich packe das zweite Feld als concat in die letzte WHERE-Klausel mit rein, dann scheint es zu funktionieren. Das sieht zwar nicht so schön aus, in sofern bin ich für Vorschläge sehr offen...
Delphi-Quellcode:
update as400 set
  sequence = case
      when (concat(waaunr,'-',waaupo) ='408216-0' and oaagnr =10) then 1
      when (concat(waaunr,'-',waaupo) ='408217-0' and oaagnr =10) then 2
      when (concat(waaunr,'-',waaupo) ='408218-0' and oaagnr =10) then 3
      else 0
  end,
  frozen = case
      when (concat(waaunr,'-',waaupo) ='408216-0' and oaagnr =10) then 1
      when (concat(waaunr,'-',waaupo) ='408217-0' and oaagnr =10) then 1
      when (concat(waaunr,'-',waaupo) ='408218-0' and oaagnr =10) then 0
      else 0
  end,
  plan_date = case
      when (concat(waaunr,'-',waaupo) ='408216-0' and oaagnr =10) then '2019-07-05'
      when (concat(waaunr,'-',waaupo) ='408217-0' and oaagnr =10) then '2019-07-05'
      when (concat(waaunr,'-',waaupo) ='408218-0' and oaagnr =10) then '2019-07-06'
      else '000-00-00'
  end
where concat(waaunr,'-',waaupo,'-',oaagnr) in ('408216-0-10', '408217-0-10', '408218-0-10')
Vielen Dank
Patrick

hoika 5. Jul 2019 16:13

AW: Mehrfach Update STatement
 
Puh,
und das kurz vorm Wochenende.

Aber wenn es geht, ist doch gut.

Ykcim 5. Jul 2019 17:04

AW: Mehrfach Update STatement
 
Vielen Dank für die Unterstützung.
Schönes Wochenende

peterbelow 6. Jul 2019 11:17

AW: Mehrfach Update STatement
 
Zitat:

Zitat von Ykcim (Beitrag 1436080)
Hallo Zusammen,

ich versuche mich gerade an einem Statement, mit dem ich mehrere Zeilen (hier im Beispiel 3 Zeilen) mit jeweil 3 Werten updaten möchte. Wenn ich das mit einzelnen SQL-Statements mache, wird die Procedure sehr langsam.

Folgendes habe ich gefunden, bzw. auf meinen Fall umgebaut:
Delphi-Quellcode:
update as400 set
  sequence = case
      when concat(waaunr,'-',waaupo) ='408216-0' and oaagnr =10 then 1
      when concat(waaunr,'-',waaupo) ='408217-0' and oaagnr =10 then 2
      when concat(waaunr,'-',waaupo) ='408218-0' and oaagnr =10 then 3
  end,
  frozen = case
      when concat(waaunr,'-',waaupo) ='408216-0' and oaagnr =10 then 1
      when concat(waaunr,'-',waaupo) ='408217-0' and oaagnr =10 then 1
      when concat(waaunr,'-',waaupo) ='408218-0' and oaagnr =10 then 0
  end,
  plan_date = case
      when concat(waaunr,'-',waaupo) ='408216-0' and oaagnr =10 then '2019-07-05'
      when concat(waaunr,'-',waaupo) ='408217-0' and oaagnr =10 then '2019-07-05'
      when concat(waaunr,'-',waaupo) ='408218-0' and oaagnr =10 then '2019-07-06'
  end
where concat(waaunr,'-',waaupo) in ('408216-0', '408217-0', '408218-0')
Aber leider habe ich das Problem, dass ich die Fehlermeldung "Column 'sequence' cannot be null" bekomme.

Wenn ich das richtig sehe, wird der Wert für die Spalten nicht erkannt.

Sieht jemand was ich falsch mache und kann mir jemand einen Tip geben?

Vielen Dank
Patrick

So wie ich das sehe ist die where-Klausel nicht richtig konstruiert. oaagnr ist doch für alle Zeilen, die upgedated werden sollen, gleich (10 im obigen Beispiel), oder. Daher gehört diese Bedingung in die where-Klausel, nicht in die when-Klauseln für das Case statement. Mit deinem obigen Konstrukt findet die Query auch Zeilen, die zwar die gewünschte waaaunr und waaupo-Werte haben, aber andere oaagnr-Werte. Die werden upgedatet, nur halt mit NULL da keines der when-Klauseln auf die Zeile Matcht.

Delphi-Quellcode:
update as400 set
  sequence = case
      when concat(waaunr,'-',waaupo) ='408216-0' then 1
      when concat(waaunr,'-',waaupo) ='408217-0' then 2
      when concat(waaunr,'-',waaupo) ='408218-0' then 3
  end,
  frozen = case
      when concat(waaunr,'-',waaupo) ='408216-0' then 1
      when concat(waaunr,'-',waaupo) ='408217-0' then 1
      when concat(waaunr,'-',waaupo) ='408218-0' then 0
  end,
  plan_date = case
      when concat(waaunr,'-',waaupo) ='408216-0' then '2019-07-05'
      when concat(waaunr,'-',waaupo) ='408217-0' then '2019-07-05'
      when concat(waaunr,'-',waaupo) ='408218-0' then '2019-07-06'
  end
where concat(waaunr,'-',waaupo) in ('408216-0', '408217-0', '408218-0')
  and (oaagnr =10)
Wer auf diese Spaltennamen gekommen ist gehört übrigens standrechtlich erschossen. :wink:

Delphi.Narium 6. Jul 2019 12:04

AW: Mehrfach Update Statement
 
Zitat:

Zitat von peterbelow (Beitrag 1436154)
So wie ich das sehe ist die where-Klausel nicht richtig konstruiert. oaagnr ist doch für alle Zeilen, die upgedated werden sollen, gleich (10 im obigen Beispiel), oder. Daher gehört diese Bedingung in die where-Klausel, nicht in die when-Klauseln für das Case statement. Mit deinem obigen Konstrukt findet die Query auch Zeilen, die zwar die gewünschte waaaunr und waaupo-Werte haben, aber andere oaagnr-Werte. Die werden upgedatet, nur halt mit NULL da keines der when-Klauseln auf die Zeile Matcht.

Delphi-Quellcode:
update as400 set
  sequence = case
      when concat(waaunr,'-',waaupo) ='408216-0' then 1
      when concat(waaunr,'-',waaupo) ='408217-0' then 2
      when concat(waaunr,'-',waaupo) ='408218-0' then 3
  end,
  frozen = case
      when concat(waaunr,'-',waaupo) ='408216-0' then 1
      when concat(waaunr,'-',waaupo) ='408217-0' then 1
      when concat(waaunr,'-',waaupo) ='408218-0' then 0
  end,
  plan_date = case
      when concat(waaunr,'-',waaupo) ='408216-0' then '2019-07-05'
      when concat(waaunr,'-',waaupo) ='408217-0' then '2019-07-05'
      when concat(waaunr,'-',waaupo) ='408218-0' then '2019-07-06'
  end
where concat(waaunr,'-',waaupo) in ('408216-0', '408217-0', '408218-0')
  and (oaagnr =10)
Wer auf diese Spaltennamen gekommen ist gehört übrigens standrechtlich erschossen. :wink:

Erscheint mir noch zu kompliziert.
Falls waaunr Integer, dann Hochkommas weg!!!
SQL-Code:
update as400 set
  sequence = case
      when waaunr = '408216' then 1
      when waaunr = '408217' then 2
      when waaunr = '408218' then 3
  end,
  frozen = case
      when waaunr = '408216' then 1
      when waaunr = '408217' then 1
      when waaunr = '408218' then 0
  end,
  plan_date = case
      when waaunr = '408216' then '2019-07-05'
      when waaunr = '408217' then '2019-07-05'
      when waaunr = '408218' then '2019-07-06'
  end
where waaunr in ('408216', '408217', '408218')
  and waaupo = 0
  and oaagnr = 10
Concats in Wherebedingungen machen das nur langsamer, da kaum ein Index genutzt werden kann. Mag bei kleinen Datenmengen ok sein, aber allgemein lieber eher nicht.

Und so, wie man in 'ner Wherebedingung mehrere Vergleiche per And oder per Or verknüpfen kann, kann man das auch im When. Sind mehrere Spalten bei einem When zu vergleichen, dann ist der Vergleich als Zeichenfolge via Concat eher die schlechtere Alternative.

Ykcim 8. Jul 2019 08:15

AW: Mehrfach Update STatement
 
Hallo Zusammen,

oaagnr kann unterschiedlich sein. In diesem aktuellen Beispiel ist es zwar identisch, aber bei nachfolgenden Prozessen ist das nicht sichergestellt. Daher muss ich es als zusätzlichen Parameter verwenden. Und auch waaupo ist zwar meistens 0 aber nicht immer...

Und wenn es unterschiedlich ist, kenne ich nicht die Syntax, es anders unterzubringen...

Gruß
Patrick

hoika 8. Jul 2019 08:23

AW: Mehrfach Update STatement
 
Hallo,
WaitCursor und gut is ;)

PS:
Eine Stored Procedure könnte das ev. noch beschleunigen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:58 Uhr.
Seite 2 von 4     12 34      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz