Autor Beitrag
OlliWausD
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 212

Win 2000/XP
Delphi 5 Professional - Interbase/Firebird
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1206
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 212

Win 2000/XP
Delphi 5 Professional - Interbase/Firebird
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 212

Win 2000/XP
Delphi 5 Professional - Interbase/Firebird
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 351

WinXP,Linux
D7 Prof, XE7
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1206
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 212

Win 2000/XP
Delphi 5 Professional - Interbase/Firebird
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 307

Win XP Prof, Linux, Win 7
D5 Prof, D7 Architect, D2005 Architect, D2007 Architect
BeitragVerfasst: So 11.01.04 12:27 
Access und Joins - das ist genauso ein Kapitel für sich, wie Oracle-Joins :twisted:
Bei Access bastelt man komplizierte Joins am besten in Access zusammen und kopert sich den SQL-Quelltext raus.

_________________
Alfons Grünewald