Autor |
Beitrag |
OlliWausD
      
Beiträge: 212
Win 2000/XP
Delphi 5 Professional - Interbase/Firebird
|
Verfasst: Mo 05.01.04 17:02
Hi Leutz
ich hab mal wieder n Problem. Und Zwar:
ich habe eine Tabelle Artikel, die über mehrere Sekondärschlüssel (Kat1, Kat2, Autor) mit anderen Tabellen wie Kategorie1 (Kat1_ID), Kategorie2( Kat2_ID) und Autor (Autor_ID) verknüpft ist.
Da aber in meiner Artikel-Tabelle nicht bei jedem Artikel ein Autor, oder eine Kategorie2 eingetragen ist, funktioniert mein SQL-Befehl nicht, da er diese leeren Felder nicht mit den Primärschlüsseln vergleichen kann.
Zitat: | query_auswahl.SQL.Text :=
'select Artikel.Art_Nr, Artikel.Titel1, Artikel.Titel2, Autor.Aut_Name, Autor.Aut_Vorname, Kategorie1.Bezeichnung as Kategorie1, Kategorie2.Bezeichnung as Kategorie2'
+' from Artikel, Autor, Kategorie1, Kategorie2'
+' where Art_Nr = ' + Edit_Art_Nr.text
+' and Artikel.autor = Autor.Aut_ID'
+' and Artikel.Kat1 = Kategorie1.Kat1_ID'
+' and Artikel.Kat2 = Kategorie2.Kat2_ID'; |
Jetzt müsste ich diese Funktion in einem Join-Befehl umschreiben. Leider kenn ich mich mit diesem Befehl nicht aus.
Kann mir jemand weiter helfen????
-Olli Ende-
_________________ Take it easy
|
|
neojones
      
Beiträge: 1206
Erhaltene Danke: 1
|
Verfasst: Mo 05.01.04 17:33
SELECT Artikel.Art_Nr, Artikel.Titel1, Artikel.Titel2, Autor.Aut_Name, Autor.Aut_Vorname, Kategorie1.Bezeichnung as Kategorie1, Kategorie2.Bezeichnung as Kategorie2'
FROM Artikel
LEFT JOIN Auto ON Artikel.autor = Autor.Aut_ID
LEFT JOIN Kategorie1 ON Kategorie1.Kat1_ID = Artikel.Kat1
LEFT JOIN Kategorie2 ON Kategorie2.Kat2_ID = Artikel.Kat2
WHERE Art_Nr = ' + Edit_Art_Nr.text
P.S.: SQL-Befehlsketten schreibt man in GROSSBUCHSTABEN wegen der Übersichtlichkeit 
_________________ Ha! Es compiliert! Wir können ausliefern!
|
|
OlliWausD 
      
Beiträge: 212
Win 2000/XP
Delphi 5 Professional - Interbase/Firebird
|
Verfasst: Di 06.01.04 03:49
danke, danke neojones.
Die Sache wird dann heute Nachmittag umgehend ausprobiert.
Ich melde mich dann zur Gegebenen Zeit noch einmal.
-Olli Ende-
_________________ Take it easy
|
|
OlliWausD 
      
Beiträge: 212
Win 2000/XP
Delphi 5 Professional - Interbase/Firebird
|
Verfasst: Di 06.01.04 18:04
so Neo, ich hab das ganze jetzt mal ausprobiert.
Leider funktioniert es nicht so, wie es soll.
Mein Problem:
Wenn ich alle 3 Left Joins mache, bringt mir Delphi einen General SQL-Fehler (Syntaxfehler)
Wenn ich aber nur einen Left Join mache, funktioniert alles einwandfrei.
Hier noch mal die eingegebenen SQL-Strings:
Der Einfachheit halber mit Select * ausprobiert.
Zitat: | SELECT * FROM Artikel a LEFT JOIN Autor au ON a.Aut = au.Aut_ID |
So funktionierts einfwandfrei // Den Sekondärschlüssel für Autor in der Tabelle Artikel habe ich übrigens in Aut umbenannt, da sonst der Name Autor 2x vergeben gewesen wäre (Tabelle und Fremdschlüssel).
Zitat: | SELECT * FROM Artikel a
LEFT JOIN Autor au ON a.Aut = au.Aut_ID
LEFT JOIN Kategorie1 K1 ON a.Kat1 = K1.Kat1_ID
LEFT JOIN Kategorie2 K2 ON a.Kat2 = K2.Kat2_ID; |
Ich habe das ganze sowohl in Delphi, als auch in Access selbst getestet. Was ist falsch??? Kann Access nur einen Join verarbeiten????
-Olli Ende-
ps.: noch ne Frage: Wieso verdrehst du bei deinem Beispiel die Syntax??
Zitat: | LEFT JOIN Auto ON Artikel.autor = Autor.Aut_ID
LEFT JOIN Kategorie1 ON Kategorie1.Kat1_ID = Artikel.Kat1 |
wenn ich logisch denke müsste das doch dann
Zitat: | LEFT JOIN Kategorie1 ON Artikel.Kat1 = Kategorie1.Kat1_ID |
heissen, oder???
_________________ Take it easy
|
|
KidPaddle
      
Beiträge: 351
WinXP,Linux
D7 Prof, XE7
|
Verfasst: Di 06.01.04 22:28
Die Join sollten funktionieren, allerdings glaube ich das dort die Klammerung fehlt, zumindestens braucht der MS SQL - Server welche. Das ganze ist manchmal recht Datenbank abhängig, allerdings hatte ich bei Access und MS SQL - Server bisher keine Schwierigkeiten.
Zitat: |
SELECT Artikel.Art_Nr, Artikel.Titel1, Artikel.Titel2, Autor.Aut_Name, Autor.Aut_Vorname, Kategorie1.Bezeichnung as Kategorie1, Kategorie2.Bezeichnung as Kategorie2'
FROM Artikel
((LEFT JOIN Auto ON (Artikel.autor = Autor.Aut_ID)) LEFT JOIN Kategorie1 ON (Kategorie1.Kat1_ID = Artikel.Kat1)) LEFT JOIN Kategorie2 ON (Kategorie2.Kat2_ID = Artikel.Kat2)
|
Bei nur einem Join braucht man keine Klammerung.
Gruß
KidPaddle
|
|
neojones
      
Beiträge: 1206
Erhaltene Danke: 1
|
Verfasst: Do 08.01.04 11:14
Stimmt. Wie ichs geschrieben hab läufts auf nem mySQL-Server einwandfrei, auf Oracle wird auch ne Klammerung erwartet, die die JOINs "priorisiert", was in Deinem Fall aber total Banane ist. Also irgendwelche Klammer setzen, dann sollts gehen.
Viele Grüße,
Matthias
_________________ Ha! Es compiliert! Wir können ausliefern!
|
|
OlliWausD 
      
Beiträge: 212
Win 2000/XP
Delphi 5 Professional - Interbase/Firebird
|
Verfasst: Fr 09.01.04 23:31
so!!! Ich habs geschafft, und zwar:
In Access sind die Klammern so angeordnet. Bitte fragt mich nicht nach dem Prinzip, das Access hier verfolgt, oder wie ich es rausbekommen habe. Ich sag nur: SCHWACHSINN !!! Aber so funktionierts:
Zitat: | SELECT A.Art_ID, A.Art_Nr, A.Titel1, A.Titel2, Au.Aut_Name AS Autor_Name, Au.Aut_Vorname AS Autor_Vorname,
[Kategorie1.Bezeichnung] AS Kategorie1,
[Kategorie2.Bezeichnung] AS Kategorie2
FROM
((Artikel AS A LEFT JOIN Autor AS Au ON A.Aut = Au.Aut_ID)
LEFT JOIN Kategorie1 ON A.Kat1 = Kategorie1.Kat1_ID)
LEFT JOIN Kategorie2 ON A.Kat2 = Kategorie2.Kat2_ID
WHERE A.Art_Nr = 12345; |
Falls ein Mod das lesen sollte, wäre es vielleicht auch nicht verkehrt die Syntax für Join-Befehle in Access in den Tutorials-Thread mit einzugliedern, da man an so ner Klammersetzung auch Stunden verbringen kann.
Mit freundlichen Grüßen
OlliWausD
_________________ Take it easy
|
|
Alfons-G
      
Beiträge: 307
Win XP Prof, Linux, Win 7
D5 Prof, D7 Architect, D2005 Architect, D2007 Architect
|
Verfasst: So 11.01.04 12:27
Access und Joins - das ist genauso ein Kapitel für sich, wie Oracle-Joins
Bei Access bastelt man komplizierte Joins am besten in Access zusammen und kopert sich den SQL-Quelltext raus.
_________________ Alfons Grünewald
|
|
|