AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi SQL: Update mit Select und IF/CASE in der Bedingung
Thema durchsuchen
Ansicht
Themen-Optionen

SQL: Update mit Select und IF/CASE in der Bedingung

Ein Thema von haentschman · begonnen am 8. Jun 2020 · letzter Beitrag vom 18. Jun 2020
Antwort Antwort
rokli

Registriert seit: 21. Mär 2009
Ort: Rödinghausen
302 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: SQL: Update mit Select und IF/CASE in der Bedingung

  Alt 8. Jun 2020, 09:15
Moin,

kannst Du ein COALESCE um das SUM machen? Dann bekommst bei nicht vorhandenen Datensätzen die ZIffer 0 zurück und kein NULL und damit sollte der UPDATE erfolgen.
Rolf
wenn nicht anders angegeben, schreibe ich zu D7, XE2 und MS SQL - ansonsten fragen Sie ihren Administrator oder einen Operator. Update 06/2020: Delphi 10.4 Sydney
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.428 Beiträge
 
Delphi 12 Athens
 
#2

AW: SQL: Update mit Select und IF/CASE in der Bedingung

  Alt 8. Jun 2020, 09:32
Danke...
Zitat:
Dann bekommst bei nicht vorhandenen Datensätzen
Die Datensätze sind ja vorhanden, nur das Kriterium für das Update (Zuordnung der Summe zu ADR.Adr) wäre bei diesen Datensätzen ein anderes. Ich möchte alle Datensätze des Subselects mit der Bedingung:
Summe aus:
1. B.Adr = ADR.Adr
+
2. B.KDNR = ADR.Adr
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.356 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: SQL: Update mit Select und IF/CASE in der Bedingung

  Alt 8. Jun 2020, 09:42
Reicht da nicht ein OR?

SQL-Code:
update
  ADR
set
  Value = (select SUM(B.Brutto) as Summe from BEL B
             where
               (B.Art = 'BLUBBor B.Art = 'BLA') and
               ( (B.Adr > 'and B.Adr = ADR.Adr) or
                 (B.KDNR = ADR.Adr)
               )
Frank Reim
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.599 Beiträge
 
Delphi 12 Athens
 
#4

AW: SQL: Update mit Select und IF/CASE in der Bedingung

  Alt 8. Jun 2020, 09:48
Reicht da nicht ein OR?

SQL-Code:
update
  ADR
set
  Value = (select SUM(B.Brutto) as Summe from BEL B
             where
               (B.Art = 'BLUBBor B.Art = 'BLA') and
               ( (B.Adr > 'and B.Adr = ADR.Adr) or
                 (B.KDNR = ADR.Adr)
               )
Das würde auch diese Fälle auswerfen:  (B.Adr > 'and B.Adr <> ADR.Adr) and (B.KDNR = ADR.Adr)
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.428 Beiträge
 
Delphi 12 Athens
 
#5

AW: SQL: Update mit Select und IF/CASE in der Bedingung

  Alt 8. Jun 2020, 09:49
Zitat:
Reicht da nicht ein OR?
...leider nicht. Mit OR kommt etwa in der Summe das Doppelte raus.
Code:
(select SUM(B.Brutto) as Summe from BEL B
             where
               (B.Art = 'BLUBB' or B.Art = 'BLA') and
                ((B.Adr IS NOT NULL and B.Adr = ADR.Adr) or
                 (B.Adr IS NULL and B.KDNR = ADR.Adr))
Da fehlen auch die Datensätze mit B.Adr = ''

PS: Das B.Adr ist nicht NULL sondern ''

Test:
Versuch des Zusammenrechnens zweier Subselects (getrennte Bedingungen) zu einem Wert...da kommt was ganz komisches raus.

Zahlen mit Original SQL:
B.Brutto = 1058373,92,
3 Datensätze mit (B.Adr = '') = 1156,01
ADR.SUMME = 1057217,91

Geändert von haentschman ( 8. Jun 2020 um 10:05 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.599 Beiträge
 
Delphi 12 Athens
 
#6

AW: SQL: Update mit Select und IF/CASE in der Bedingung

  Alt 8. Jun 2020, 10:11
PS: Das B.Adr ist nicht NULL sondern ''
OK, und so (ohne reale Daten kann man das hier nicht testen)?
Code:
(select SUM(B.Brutto) as Summe from BEL B
             where
               (B.Art = 'BLUBB' or B.Art = 'BLA') and
                ((B.Adr > '' and B.Adr = ADR.Adr) or
                 (B.Adr = '' and B.KDNR = ADR.Adr))
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.428 Beiträge
 
Delphi 12 Athens
 
#7

AW: SQL: Update mit Select und IF/CASE in der Bedingung

  Alt 8. Jun 2020, 10:24
Nach 5 Minuten habe ich abgebrochen...

Ich mache mal ein SQL mit 2 Tabelle und Daten...


Nachtrag:
Code:
create table ADR
(
  ID int identity(0,1) not null,
  Adr varchar(20),
  AdrValue int
)
create table BEL
(
  ID int identity(0,1) not null,
  Adr varchar(20),
  KDNR varchar(10),
  BelValue int
)
GO
SET IDENTITY_INSERT ADR ON
insert into ADR (ID, Adr, AdrValue) values (1, 'Bla', 0)
insert into ADR (ID, Adr, AdrValue) values (2, 'Blubb', 0)
SET IDENTITY_INSERT ADR OFF

SET IDENTITY_INSERT BEL ON
insert into BEL (ID, Adr, KDNR, BelValue) values (1, 'Bla', '', 1)
insert into BEL (ID, Adr, KDNR, BelValue) values (2, 'Bla', '', 2)
insert into BEL (ID, Adr, KDNR, BelValue) values (3, 'Bla', '', 3)
insert into BEL (ID, Adr, KDNR, BelValue) values (4, '', 'Bla', 4)
insert into BEL (ID, Adr, KDNR, BelValue) values (5, 'Blubb', '', 2)
insert into BEL (ID, Adr, KDNR, BelValue) values (6, 'Blubb', '', 3)
SET IDENTITY_INSERT BEL OFF
GO
Original SQL Bedingung:
Code:
UPDATE
  ADR
SET
  AdrValue = (select SUM(B.BelValue) as Summe from BEL B
                where
             b.Adr = ADR.Adr)
Egebnis:
Bla = 6 -> Erwartet 10 incl. KDNR = Bla
Blubb = 5

Geändert von haentschman ( 8. Jun 2020 um 11:16 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.428 Beiträge
 
Delphi 12 Athens
 
#8

AW: SQL: Update mit Select und IF/CASE in der Bedingung

  Alt 8. Jun 2020, 11:21
Danke an Alle...

Der Preis geht an Uwe. Mit meiner Test DB kommt das erwartete Ergebnis raus. Meiner DB fehlt mit Sicherheit nur ein Index was die Laufzeit erklärt.

Nachtrag:
Das Ergebnis ist korrekt.

DB: 3GB
-> relevante Daten 8000 Datensätze (Update)
* ohne Index (fehlende Felder): nach 5 Minuten abgebrochen
* Index mit allen relevanten Feldern / einzeln oder zusammengesetzt: 22s
* Index mit nur einer Bedingung (wie früher): 1s


Ideen für Optimierung?

Geändert von haentschman ( 8. Jun 2020 um 12:34 Uhr)
  Mit Zitat antworten Zitat
RSF

Registriert seit: 13. Mär 2008
155 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: SQL: Update mit Select und IF/CASE in der Bedingung

  Alt 8. Jun 2020, 09:56
Ich hoffe das Problem verstanden zu haben: Null Werte gehen nicht.
Die Null-Felder müssen vor Berechnungen erst auf einen definierten Wert gebracht werden
z.B.

Code:
NULLIF(( Select SUM(Brutto) From Artikel Where(ID_Nr=did_jumbo)),0);
Ronald
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.599 Beiträge
 
Delphi 12 Athens
 
#10

AW: SQL: Update mit Select und IF/CASE in der Bedingung

  Alt 8. Jun 2020, 09:46
Was spricht denn gegen das hier?
SQL-Code:
(select SUM(B.Brutto) as Summe from BEL B
             where
               (B.Art = 'BLUBBor B.Art = 'BLA') and
                ((B.Adr IS NOT NULL and B.Adr = ADR.Adr) or
                 (B.Adr IS NULL and B.KDNR = ADR.Adr))
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:54 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 by Thomas Breitkreuz