![]() |
Datenbank: Ms-Sql • Version: 2012 • Zugriff über: --
Bekomme Inner Joins nicht hin
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:
Item_Rev:
Dann habe ich das auf meinem PC in einer Sqlite-Datenbank umgesetzt. Folgende Query sollte mir alle Items in der neusten Revision liefern:
Code:
Gesagt, getan. In SQLite kommt genau heraus was ich mir vorgestellt habe 😎👍
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 Dann habe ich das auf MS-SQL umgesetzt. Die Query so nimmt er nicht an, er meint Zitat:
Code:
Daraufhin meint er
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 Zitat:
Code:
Das Problem: Ich erhalte hier die Items in allen ihren Revisionen. Es ist das gleiche als hätte ich geschrieben
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
Code:
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?
SELECT [Spalten...] From Item JOIN Item_Rev ON (Item.rev = Item_Rev.id)
|
AW: Bekomme Inner Joins nicht hin
So ganz steige ich da noch nicht durch. Das Inner-Select lautet
Code:
Dabei ist id laut Anmerkung ein AutoInc-Feld - also eindeutig. Ein Group By über ein eindeutiges AutoInc-Feld ist aber irgendwie witzlos, da jeder Feldwert ja eh nur einmal vorkommen kann. Du kannst ja mal einfach nur diese Query ausführen und wirst vermutlich alle Datensätze zurückbekommen.
SELECT id AS fkey, MAX(changeTimestamp) changeTimestamp, changeComment
FROM Item_Rev GROUP BY id, changeComment |
AW: Bekomme Inner Joins nicht hin
Ja, ich bekomme praktisch alles. Beide Tabellen haben eine Spalte
Delphi-Quellcode:
. Ich möchte natürlich nicht nach dem AutoInc-id, sondern nach der Text-ID aus Tabelle "item" gruppieren.
id
SQLite scheint das richtig zu machen. Wenn ich in MS-SQL jetzt aus "GROUP BY id" ein "GROUP BY Item.id" mache sagt er mir Zitat:
|
AW: Bekomme Inner Joins nicht hin
SQL-Code:
?
GROUP BY a.id
|
AW: Bekomme Inner Joins nicht hin
Nope, ob mit a. oder ohne macht keinen Unterschied.
Ich verstehe das nicht. War der Sinn von SQL nicht dass man es über verschiedene Datenbank-Systeme hinweg verwenden könne? |
AW: Bekomme Inner Joins nicht hin
Code:
vielleicht so:
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
Code:
SELECT
a.rev, a.Daten1, a.Daten2, MAX(b.changeTimestamp) changeTimestamp, b.changeComment FROM Item a INNER JOIN Item_Rev b ON (a.rev = b.id) GROUP BY a.Daten1, a.Daten2, b.changeComment |
AW: Bekomme Inner Joins nicht hin
Höchste Revisionsnummer zum Item suchen:
SQL-Code:
SELECT id, Max(rev) from Item group by ID
Das folgende führt nicht zum gewünschten Ergebnis, da hier das höchste Änderungsdatum zu ID UND Änderungskommentar gesucht wird. Das kann nur dann zum "annähernd" gewünschten Ergebnis führen, wenn alle Kommentare gleich sind.
SQL-Code:
Eventuell so?
SELECT id AS fkey, MAX(changeTimestamp) changeTimestamp, changeComment
FROM Item_Rev GROUP BY id, changeComment
SQL-Code:
PS: Bin eher ein alter Knacker, deshalb nehme ich lieber die (für mich) leichter lesbare alte Form für Joins.
select
Item.Id, Item.Rev, Item.Daten1, Item.Daten2, Item_Rev.changeTimestamp, Item_Rev.changeComment from Item, Item_Rev, (SELECT Id, Max(Rev) As Rev from Item group by ID) Max_Rev where Item.rev = Item_Rev.id and Item.ID = Max_Rev.ID and Item.Rev = Max_Rev.Rev |
AW: Bekomme Inner Joins nicht hin
Zitat:
Zitat:
MS-SQL ist schon seltsam. Ich denke es jetzt mit einer völlig anders formulierten Query hinbekommen zu haben:
Code:
In SQLite funktioniert das umgekehrt auch. Ist das jetzt geschickt oder eine Performance-Katastrophe? Und was MS-SQL eigentlich für ein Problem mit dem ersten Statement das in SQLite so gut geht?
SELECT * FROM Auftrag JOIN Auftrag_Rev
ON (Auftrag.rev = Auftrag_Rev.id) WHERE Auftrag.rev in ( SELECT MAX(rev) rev FROM Auftrag JOIN Auftrag_Rev ON (Auftrag.rev = Auftrag_Rev.id) GROUP BY Auftrag.id ) ; Irgendwie weiß ich weshalb ich Kontakt mit relationalen Datenbanken so gut wie möglich vermeide... Update Zitat:
Vielen Dank! |
AW: Bekomme Inner Joins nicht hin
Zitat:
![]() Zitat:
|
AW: Bekomme Inner Joins nicht hin
Danke. Dann fühle ich in meiner Einstellung Bleibe Datenbanken fern solange du kannst ja bestärkt 🤣
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz