Frage Update-Statement

TeholBeddict

Benutzer
Beiträge
7
Hallo Experten,

evtl. kann mir jemand bei meiner gewünschten Abfrage auf die Sprünge helfen (ich bin nicht gerade eine SQL-Leuchte).

Ich habe drei Tabellen, bei denen die einzelnen Datensätze über eine ID eindeutig zugeordnet werden können. In Tabelle A gibt es zu jeder ID einen Datumswert, die Tabellen B und C enthalten ebenfalls Werte nach denen gruppiert werden müsste.

Tabelle1
ID Datum
1 01.01.2015
2 01.01.2014
3 01.01.2013
4 01.01.2012
5 01.01.2011
6 01.01.2010

Tabelle2
ID Wert1
1 A
2 A
3 B
4 B
5 A
6 A

Tabelle3
ID Wert2 MIN_Datum
1 A
2 A
3 A
4 A
5 B
6 B

So sollte dann das Ergebnis in Spalte MIN_Datum ausschauen:
Tabelle3
ID Wert2 MIN_Datum
1 A 01.01.2014
2 A 01.01.2014
3 A 01.01.2012
4 A 01.01.2012
5 B 01.01.2010
6 B 01.01.2010


Viele Grüße
TB

[EDIT]
Sorry, mein Fehler! Bitte den Thread nach Microsoft SQL Server verschieben
 
Zuletzt bearbeitet:
Werbung:
warum is das min_datum für id 1 und 2 anders als für 3 und 4?

Code:
test=*# select t2.wert1, min(t1.datum) from tabelle2 t2 left join tabelle1 t1 on t1.id=t2.id group by t2.wert1;
 wert1 |  min   
-------+------------
 b  | 2012-01-01
 a  | 2010-01-01
(2 Zeilen)

test=*# update tabelle3 set min_datum = foo.min from (select t2.wert1, min(t1.datum) from tabelle2 t2 left join tabelle1 t1 on t1.id=t2.id group by t2.wert1) foo where foo.wert1=tabelle3.wert2;
UPDATE 6
test=*# select * from tabelle3;
 id | wert2 | min_datum  
----+-------+------------
  1 | a  | 2010-01-01
  2 | a  | 2010-01-01
  3 | a  | 2010-01-01
  4 | a  | 2010-01-01
  5 | b  | 2012-01-01
  6 | b  | 2012-01-01
(6 Zeilen)

test=*#

PostgreSQL, wie bei mir üblich.
 
Hallo akretschmer,


das SELECT-Statement habe ich hinbekommen (mit Erweiterung um Wert2):


SELECT Tabelle2.Wert1, Tabelle3.Wert2,MIN(Tabelle1.Datum)

FROM Tabelle2

INNERJOIN Tabelle1

ON Tabelle1.ID= Tabelle2.ID

INNERJOIN Tabelle3

ON Tabelle3.ID = Tabelle2.ID

GROUP BY Tabelle2.Wert1, Tabelle3.Wert2


Was ich allerdings nicht so ganz verstehe, ist dein UPDATE-Statement. Insbesondere folgende beiden Stellen:

= foo.min from

foo where foo.wert1


Soll foo eine Art temporäre Tabelle sein und wird zum ablegen von Variablen genutzt?
 
Ja, das ist ein Subselect, achte auf die Klammern vor dem ersten Auftreten vor foo. Diesem Subselect, welcher ja eine 'virtuelle' Tabelle liefert, muß ich einem Namen geben.
 
Aber woher bekommt foo.wert1 einen Wert mit dem unter WHERE verglichen wird? Müsste ich die Werte von Wert1 und Wert2 nicht vorher in foo.wert1 und foo.wert2 schreiben?
 
Evtl. ist die Syntax bei MS SQL etwas anders. Ich habe es jetzt so gelöst (wahrscheinlich viel zu kompliziert):


CREATETABLE #foo(Datum DATETIME, Wert1 varchar(255), Wert2 varchar(255))

INSERTINTO #foo(Wert1, Wert2, Datum)
SELECT Tabelle2.Wert1, Tabelle3.Wert2,MIN(Tabelle1.Datum)
FROM Tabelle2
INNERJOIN Tabelle1
ON Tabelle1.ID= Tabelle2.ID
INNERJOIN Tabelle3
ON Tabelle3.ID = Tabelle2.ID
GROUP BY Tabelle2.Wert1, Tabelle3.Wert2

UPDATE Tabelle3
SET MIN_Datum ) = #foo.Datum
FROM #foo, Tabelle2,
INNER JOIN Tabelle3
ON Tabelle3.ID = Tabelle2.ID
WHERE Tabelle3.Wert2 = #foo.Wert2 AND Tabelle2.Wert1 = #foo.Wert1

Vielen Dank für den Lösungsvorschlag mit einer temporären Tabelle. Diese Möglichkeit war mir überhaupt nicht bekannt und ich hatte mich mit Variablen herumgequält.
 
Nachdem ich mich noch ein wenig mit der Materie beschäftigt habe, habe ich die Lösung von akretschmer doch noch zum Laufen gebracht. Mit folgenden kleinen Anpassungen:

update tabelle3
set min_datum = foo.min
from Tabelle2, (
SELECT Tabelle2.Wert1, Tabelle3.Wert2, MIN(Tabelle1.Datum) AS min
FROM Tabelle2
INNERJOIN Tabelle1
ON Tabelle1.ID= Tabelle2.ID
INNERJOIN Tabelle3
ON Tabelle3.ID = Tabelle2.ID
GROUP BY Tabelle2.Wert1, Tabelle3.Wert2)
AS foo
WHERE Tabelle3.Wert2 = #foo.Wert2 AND Tabelle2.Wert1 = #foo.Wert1


Vielen Dank noch einmal!
 
Werbung:
Natürlich hatte sich noch ein Fehler eingeschlichen:

UPDATE tabelle3
SET min_datum = foo.min
FROM
Tabelle2,
INNER JOIN Tabelle3
ON Tabelle3.ID = Tabelle2.ID,
( SELECT Tabelle2.Wert1, Tabelle3.Wert2, MIN(Tabelle1.Datum) AS min
FROM Tabelle2
INNERJOIN Tabelle1
ON Tabelle1.ID= Tabelle2.ID
INNERJOIN Tabelle3
ON Tabelle3.ID = Tabelle2.ID
GROUP BY Tabelle2.Wert1, Tabelle3.Wert2)
AS foo
WHERE Tabelle3.Wert2 = foo.Wert2 AND Tabelle2.Wert1 = foo.Wert1
 
Zurück
Oben