Aktualisierung über 2 DB

dwache

Benutzer
Beiträge
5
Hallo ich versuche das UPDATE wie folgt:

UPDATE Monatsauswertung
SET Monatsauswertung.Einnahmen =
(
SELECT SUM(einkauffstatistik2.hanseatik_visa OR Einkauf_Datum BETWEEN '2024-03-01' AND '2024-04-31' )

FROM einkauffstatistik2
WHERE
Monatsauswertung.Einkäufe=Monatsauswertung.Einkäufe HAVING id=13,

jedoch wird nicht nur die ID 13 aktualisert.
Wie komme ich hier weiter?
 
Werbung:
Wie komme ich hier weiter?
Du solltest Dir vielleicht ein paar Grundlagen anschauen, alleine die Begriffe.
Mit 2 DB meinst Du vermutlich lediglich 2 Tabellen?

Ein "having" gehört zu einem Group By Statement und schränkt das gruppierte Ergebnis ein. Das passt nicht zu Deinem Aggregat in dem geklammerten Statement.

Was soll die Where Bedingung bringen, die auf beiden Seiten des Gleichheitsoperators den gleichen Ausdruck verwendet? Sie trifft immer zu, damit sind wir schon nahe an Deinem Ergebnis, bei dem alle DS aktualisiert werden.

"id = 13"
Niemand hier weiß, woher dieses Feld kommen sollte. Aus Tabelle Monatsauswertung oder aus ..statistik?
Wenn Du schon keine Tabellendefinition mit gibst hier, dann sollte die Abfrage wenigstens vollständig mit Tabellen Aliasen versehen sein, damit die Helfer wenigstens eine grobe Idee haben, was Du vor hast.

Zuletzt und generell zu Deiner Frage:
Was Du suchst ist ein korreliertes Update (wahrscheinlich), auch wenn Dein Subquery so aussieht, als sei es dank der fest angegebenen Parameter autark. Schau Dir mal Beispiele zu dem Stichwort an. Die Syntax in Update Statements dieser Art ist leider sehr unterschiedlich bei den verschiedenen Anbietern und da ich mySQL niemals einsetzen würde, ist mir das nicht so geläufig.

Hier ist ein Beispiel (mit Group By, was Du aber in der Form wahrscheinlich gar nicht brauchst). Das Prinzip ist aber vielleicht das, was Du brauchst:
Code:
UPDATE Table AS target
INNER JOIN
(
select category, appearances_sum
from Table T inner join (
    select category as cat, sum(appearances) as appearances_sum
    from Table
    group by cat
) as agg
where T.category  = agg.cat
group by category
) as source
ON target.category = source.category
SET target.probability = target.appearances / source.appearances_sum
 
Hier einmal ein komplettes Beispiel:


Tabellen erstellen:

Code:
select version();


| version() |
|:----------|
| 10.6.9-MariaDB-1:10.6.9+maria~deb11 |




CREATE TABLE monatsauswertung (
    id INT AUTO_INCREMENT PRIMARY KEY,
    einnahme DECIMAL(10, 2),
    auswertungsdatum DATE
);
CREATE TABLE verkaeufe (
    id INT AUTO_INCREMENT PRIMARY KEY,
    verkaufsid INT,
    betrag DECIMAL(10, 2),
    datum DATE
);
INSERT INTO monatsauswertung (einnahme, auswertungsdatum) VALUES
(10.50, '2024-04-01'),(10.75, '2024-04-15'),(20.00, '2024-04-30');


INSERT INTO verkaeufe (verkaufsid, betrag, datum) VALUES
('1', 500.25, '2024-04-05'),('2', 750.50, '2024-04-10'),('2', 1000.75, '2024-04-20');


SELECT * FROM monatsauswertung;


| id | einnahme | auswertungsdatum |
|---:|---------:|:-----------------|
| 1 | 10.50 | 2024-04-01 |
| 2 | 10.75 | 2024-04-15 |
| 3 | 20.00 | 2024-04-30 |


Verbinden der Tabellen über JOIN

Code:
SELECT m.*, v.*
FROM monatsauswertung m
LEFT JOIN verkaeufe v ON m.id = v.verkaufsid
WHERE v.datum BETWEEN '2024-04-01 00:00:0' AND '2024-04-30 23:59:59';
```
| id | einnahme | auswertungsdatum | id | verkaufsid | betrag | datum |
|---:|---------:|:-----------------|---:|-----------:|-------:|:------|
| 1 | 10.50 | 2024-04-01 | 1 | 1 | 500.25 | 2024-04-05 |
| 2 | 10.75 | 2024-04-15 | 2 | 2 | 750.50 | 2024-04-10 |
| 2 | 10.75 | 2024-04-15 | 3 | 2 | 1000.75 | 2024-04-20 |


Gruppieren der Werte

Code:
SELECT m.id, SUM(v.betrag) AS TOTAL_VERKAEUFE
FROM monatsauswertung m
LEFT JOIN verkaeufe v ON m.id = v.verkaufsid
WHERE v.datum BETWEEN '2024-04-01 00:00:0' AND '2024-04-30 23:59:59'
GROUP BY m.id;


| id | TOTAL\_VERKAEUFE |
|---:|----------------:|
| 1 | 500.25 |
| 2 | 1751.25 |

Gruppieren und auf eine id einschränken

Code:
SELECT m.id, SUM(v.betrag) AS TOTAL_VERKAEUFE
FROM monatsauswertung m
LEFT JOIN verkaeufe v ON m.id = v.verkaufsid
WHERE v.datum BETWEEN '2024-04-01 00:00:0' AND '2024-04-30 23:59:59'
AND m.id = 2
GROUP BY m.id;


| id | TOTAL\_VERKAEUFE |
|---:|----------------:|
| 2 | 1751.25 |

Bei einem UPDATE geht dies so:

Code:
UPDATE monatsauswertung m
LEFT JOIN (
    SELECT verkaufsid, SUM(betrag) AS gesamtbetrag, MAX(datum) AS max_datum
    FROM verkaeufe
    WHERE datum BETWEEN '2024-04-01 00:00:00' AND '2024-04-30 23:59:59'
    GROUP BY verkaufsid
) v ON m.id = v.verkaufsid
SET m.einnahme = IFNULL(v.gesamtbetrag, 0),
    m.auswertungsdatum = IFNULL(v.max_datum, m.auswertungsdatum)
WHERE m.id = 2;





SELECT * FROM monatsauswertung;


| id | einnahme | auswertungsdatum |
|---:|---------:|:-----------------|
| 1 | 10.50 | 2024-04-01 |
| 2 | 1751.25 | 2024-04-20 |
| 3 | 20.00 | 2024-04-30 |

Hier das Beispiel: MariaDB 10.6





[fiddle](https://dbfiddle.uk/YWJjN8AY)
 
Werbung:
Zurück
Oben