Eins vorweg: Ich habe mit Datenbanken extrem wenig Erfahrung.
Ich habe in meiner Datenbank "Items". Wenn diese verändert werden soll der alte Stand nicht gelöscht werden, sondern ein neuer hinzugefügt werden wo die Revisionsnummer höher ist.
Meine Struktur sieht so aus:
Item:
Name | Typ | Anmerkung |
id | TEXT | |
rev | INT | Fkey auf Item_Rev.id |
Daten1 | ? | |
Daten2 | ? | |
Item_Rev:
Name | Typ | Anmerkung |
id | INT | (AutoInc) |
changeTimestamp | DATETIME | |
changeComment | TEXT | |
Dann habe ich das auf meinem PC in einer Sqlite-Datenbank umgesetzt. Folgende
Query sollte mir alle Items in der neusten Revision liefern:
Code:
SELECT
id, Daten1, Daten2, MAX(changeTimestamp) changeTimestamp, changeComment
FROM Item a INNER JOIN (
SELECT id fkey, MAX(changeTimestamp) changeTimestamp, changeComment
FROM Item_Rev
GROUP BY fkey, changeComment
) b ON (a.rev = b.fkey)
GROUP BY id
Gesagt, getan. In SQLite kommt genau heraus was ich mir vorgestellt habe 😎👍
Dann habe ich das auf MS-
SQL umgesetzt. Die
Query so nimmt er nicht an, er meint
Zitat:
SQL-Fehler [207] [S0001]: Ungültiger Spaltenname 'fkey'.
. Gut, dann habe ich das GROUP BY folgendermaßen abgeändert:
Code:
SELECT
id, Daten1, Daten2, MAX(changeTimestamp) changeTimestamp, changeComment
FROM Item a INNER JOIN (
SELECT id AS fkey, MAX(changeTimestamp) changeTimestamp, changeComment
FROM Item_Rev
GROUP BY id, changeComment
) b ON (a.rev = b.fkey)
GROUP BY id
Daraufhin meint er
Zitat:
SQL-Fehler [8120] [S0001]: Die Item.Daten1-Spalte ist in der Auswahlliste ungültig, da sie nicht in einer Aggregatfunktion und nicht in der GROUP BY-Klausel enthalten ist.
Gut, dann füge ich die auch noch an:
Code:
SELECT
id, Daten1, Daten2, MAX(changeTimestamp) changeTimestamp, changeComment
FROM Item a INNER JOIN (
SELECT id AS fkey, MAX(changeTimestamp) changeTimestamp, changeComment
FROM Item_Rev
GROUP BY id, changeComment
) b ON (a.rev = b.fkey)
GROUP BY id, Daten1, Daten2, changeComment
Das Problem: Ich erhalte hier die Items in allen ihren Revisionen. Es ist das gleiche als hätte ich geschrieben
Code:
SELECT [Spalten...] From Item JOIN Item_Rev ON (Item.rev = Item_Rev.id)
Was läuft hier falsch? Bin ich bei der "fkey"-Sache schon falsch abgebogen? Wenn SQLite etwas kann, dann muss MS-
SQL das doch schon lange können, oder?