Einzelnen Beitrag anzeigen

Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Bekomme Inner Joins nicht hin

  Alt 18. Dez 2018, 16:47
Datenbank: Ms-Sql • Version: 2012 • Zugriff über: --
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:
NameTypAnmerkung
id TEXT 
rev INT Fkey auf Item_Rev.id
Daten1 ? 
Daten2? 

Item_Rev:
NameTypAnmerkung
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?
  Mit Zitat antworten Zitat