Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQL update mit Bedingung aus anderer Tabelle (https://www.delphipraxis.net/206245-sql-update-mit-bedingung-aus-anderer-tabelle.html)

noisy_master 3. Dez 2020 09:48

Datenbank: Paradox • Version: xx • Zugriff über: BDE

SQL update mit Bedingung aus anderer Tabelle
 
Hallo Gemeinde,

auch für mich geht endlich die Zeit der BDE vorbei, aber vorher muss ich noch ein kleines Update fertig machen.
Ich stehe vor folgendem Problem:

Ich habe zwei Tabellen A und B. Beide Tabellen haben ein bool Feld(DORESET). Tabelle A KANN(!) eine Referenz zu Tabelle B haben, muss aber nicht (Feld: REFERENCE). Nun muss ich in Tabelle A ein Feld(AKTWERT) auf 0 setzen, wenn entweder
1. A.REFERENCE=NULL and A.DORESET=TRUE
oder
2. A.REFERECE != NULL and B.DORESET=TRUE (wobei B = A.REFERENCE ist).

Teil 1 ist einfach :
UPDATE A SET AKTWERT=0 WHERE DORESET=TRUE AND REFERENCE IS NULL

Für die 2. Variante habe ich aber absolut keine Ahnung, wie ich das hinbekomme. Geht das überhaupt in einem Command? Hat da irgendjemand eine Idee?

Ich danke schonmal wieder im voraus!

Und ja: ich werde die BDE bald endgültig einstampfen 8-)

Gruß

Delphi.Narium 3. Dez 2020 10:20

AW: SQL update mit Bedingung aus anderer Tabelle
 
Bevor ich ein Update mache, schaue ich erstmal, ob ich ein passendes Select hinbekomme, um mir die Daten ansehen zu können.

Der Umbau auf Update ist dann (meist) recht einfach, da sich die Wherebedingung ja nicht ändert.
SQL-Code:
select a.Reference, b.Reference, b.DoReset
from a, b
where a.Reference = b.Reference
and  a.Reference is not null
and  b.DoReset  = true
Wenn das das richtige Ergebnis liefert, könnte der "Rest" ungefähr so aussehen:
SQL-Code:
update a set Aktwert = 0 
where a.Reference in (
  select a.Reference
  from a, b
  where a.Reference = b.Reference
  and  a.Reference is not null
  and  b.DoReset  = true
)
Und nein, ein Performancekunstwerk wird dieses Statement ganz bestimmt nicht werden ;-)
Aber für ein "brauch' ich nur einmal" sollte es reichen.

noisy_master 4. Dez 2020 07:14

AW: SQL update mit Bedingung aus anderer Tabelle
 
UI, toll!

Vielen Dank!! Sieht so aus als würde es mein Problem lösen!!!
Jetzt noch eine vermessene Frage:

Bekommt ihr SQL Gurus das auch hin, Teil 1 und 2 zu kombinieren? Ist kein muss, aber sähe schon geil aus ;-)

Danke
Gruß

mkinzler 4. Dez 2020 07:48

AW: SQL update mit Bedingung aus anderer Tabelle
 
Beide Bedingungen in ein OR packen
SQL-Code:
update a set Aktwert = 0
where a.Reference in (
  select
    a.Reference
  from
    a, b
  where
    (a.Reference is null and
     a.DORESET is true) or
    (a.Reference = b.Reference and
     a.Reference is not null and
     b.DoReset = true)
)

noisy_master 4. Dez 2020 15:09

AW: SQL update mit Bedingung aus anderer Tabelle
 
ok,ok....Wald und Bäume und so...:?

DANKE vielmals!

Rollo62 5. Dez 2020 08:13

AW: SQL update mit Bedingung aus anderer Tabelle
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von noisy_master (Beitrag 1478518)
ok,ok....Wald und Bäume und so...:?

DANKE vielmals!

Damit man Bäume besser erkennt formatiere ich das in komplexen Fällen auch gerne so:
Delphi-Quellcode:
  where
        (     a.Reference is    null      
          and a.DORESET  is    true)
    or (     a.Reference =     b.Reference
          and a.Reference is not null
          and b.DoReset  =     true)
Edit:
Sorry die Forensuftware killt immer die Formatierungen
Anhang 53373

himitsu 5. Dez 2020 11:05

AW: SQL update mit Bedingung aus anderer Tabelle
 
Verwende [CODE] statt [DELPHI], dort ist das nicht "ganz" so schlimm,

abgesehn davon, dass es eh kein Delphi-Code ist :stupid:, also vielleicht auch mal [CODE=SQL] versuchen. [EDIT] Nein, dort sind leider auch die Leerzeichen falsch. [/EDIT]



PS: Vielleicht auch mal auf einwas Einigen?
SQL-Code:
and x.DoReset is true
and x.DoReset = true
and x.DoReset      -- es ist ja schon ein Boolean
Und das AND "kann" weg, denn NULL wird vom
Delphi-Quellcode:
=
sowieso nicht durchgelassen.
SQL-Code:
where a.Reference = b.Reference
and a.Reference is not null

Was ist eigentlich mit a.ref=b.ref aber a.reset kein True (null oder false), oder zählt das Reset immer nur vom Letzten?
SQL-Code:
where (a.Reference is null
    and a.DoReset)
  or (a.Reference = b.Reference
    and b.DoReset) -- hier auch noch "and a.DoReset" mit rein?

where a.DoReset -- oder für Alles, weil es ja doppelt und in jedem OR drin wäre
  and (a.Reference is null
   or (a.Reference = b.Reference
     and b.DoReset))


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:00 Uhr.

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