AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Bekomme Inner Joins nicht hin

Bekomme Inner Joins nicht hin

Offene Frage von "p80286"
Ein Thema von Der schöne Günther · begonnen am 18. Dez 2018 · letzter Beitrag vom 21. Dez 2018
Antwort Antwort
Seite 1 von 6  1 23     Letzte » 
Der schöne Günther

Registriert seit: 6. Mär 2013
6.092 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
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.934 Beiträge
 
Delphi 12 Athens
 
#2

AW: Bekomme Inner Joins nicht hin

  Alt 18. Dez 2018, 17:02
So ganz steige ich da noch nicht durch. Das Inner-Select lautet
Code:
SELECT id AS fkey, MAX(changeTimestamp) changeTimestamp, changeComment
FROM Item_Rev    
GROUP BY id, changeComment
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: Bekomme Inner Joins nicht hin

  Alt 18. Dez 2018, 17:07
Ja, ich bekomme praktisch alles. Beide Tabellen haben eine Spalte id . Ich möchte natürlich nicht nach dem AutoInc-id, sondern nach der Text-ID aus Tabelle "item" gruppieren.

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:
SQL-Fehler [4104] [S0001]: Der mehrteilige Bezeichner 'Item.id' konnte nicht gebunden werden.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Bekomme Inner Joins nicht hin

  Alt 18. Dez 2018, 17:29
GROUP BY a.id ?
Markus Kinzler
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: Bekomme Inner Joins nicht hin

  Alt 18. Dez 2018, 17:42
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?
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#6

AW: Bekomme Inner Joins nicht hin

  Alt 18. Dez 2018, 18:05
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
vielleicht so:

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
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.400 Beiträge
 
Delphi 7 Professional
 
#7

AW: Bekomme Inner Joins nicht hin

  Alt 18. Dez 2018, 18:10
Höchste Revisionsnummer zum Item suchen: 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:
SELECT id AS fkey, MAX(changeTimestamp) changeTimestamp, changeComment
FROM Item_Rev
GROUP BY id, changeComment
Eventuell so?
SQL-Code:
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
PS: Bin eher ein alter Knacker, deshalb nehme ich lieber die (für mich) leichter lesbare alte Form für Joins.
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: Bekomme Inner Joins nicht hin

  Alt 18. Dez 2018, 18:14
vielleicht so
Danke, aber dann sagt er
Zitat:
SQL-Fehler [8120] [S0001]: Die Item.rev-Spalte ist in der Auswahlliste ungültig, da sie nicht in einer Aggregatfunktion und nicht in der GROUP BY-Klausel enthalten ist.

MS-SQL ist schon seltsam. Ich denke es jetzt mit einer völlig anders formulierten Query hinbekommen zu haben:

Code:
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
   )
;
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?

Irgendwie weiß ich weshalb ich Kontakt mit relationalen Datenbanken so gut wie möglich vermeide...


Update

PS: Bin eher ein alter Knacker, deshalb nehme ich lieber die (für mich) leichter lesbare alte Form für Joins.
Danke, das scheint auch zu gehen. Und ist wirklich sehr gut lesbar! Und geht auch in SQLite.

Vielen Dank!

Geändert von Der schöne Günther (18. Dez 2018 um 18:19 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.934 Beiträge
 
Delphi 12 Athens
 
#9

AW: Bekomme Inner Joins nicht hin

  Alt 18. Dez 2018, 18:37
War der Sinn von SQL nicht dass man es über verschiedene Datenbank-Systeme hinweg verwenden könne?
Nein, denn das S in SQL steht nicht für Standard sondern für Structured. Insbesondere gilt für Interoperability and standardization:
Zitat:
SQL implementations are incompatible between vendors and do not necessarily completely follow standards.
Es gibt zwar SQL Standards, aber die definieren in der Regel nur einen kleinsten gemeinsamen Nenner. Es ist mitunter auch gar nicht so leicht zu erkennen, wann man einen solchen Standard verlässt, wenn das aktuelle Konstrukt in der gerade verwendeten Datenbank zufällig noch funktioniert.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: Bekomme Inner Joins nicht hin

  Alt 18. Dez 2018, 18:40
Danke. Dann fühle ich in meiner Einstellung Bleibe Datenbanken fern solange du kannst ja bestärkt 🤣
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz