Autor Beitrag
BLR
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: Mi 03.11.10 09:12 
Hallo,

ich versuche eine Abfrage für mein Programm zu erzeugen.
Ich habe ein Primärschlüssel für den Kunden (Name, Vorname)
In einer Tabelle gibts ne Spalte "FK_Kunde" und "FK_Empfänger"

beide Spalten sind Fremdschlüssel und greifen beide auf den Primärschlüssel
von der Tabelle "Kunden" (Name, Vorname)
Ich habe das so gelöst:

ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
select re_positionen.ID_Pos,        
rechnung.RechnungsNummer,
kunde.Vorname, kunde.Name

from re_positionen
join rechnung on re_positionen.FK_RE_ID=
rechnung.ID_RE
and rechnung.ID_RE=3

join kunde on kunde.ID_Kunde = rechnung.FK_Kunde_ID
and rechnung.FK_Kunde_ID=4 //Fremdschlüssel
and rechnung.FK_Empfaenger =2//Fremdschlüssel


Das funktioniert, aber er gibt mir nur den "kunde.Vorname, kunde.Name" von dem FK_Kunde_ID, aber ich brauche auch den "kunde.Vorname, kunde.Name" von dem FK_Empfaenger

und wenn ich folgende Abfrage starte:
ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
select re_positionen.ID_Pos,        
rechnung.RechnungsNummer,
kunde.Vorname, kunde.Name

from re_positionen
join rechnung on re_positionen.FK_RE_ID=
rechnung.ID_RE
and rechnung.ID_RE=3

join kunde on kunde.ID_Kunde = rechnung.FK_Kunde_ID
and rechnung.FK_Kunde_ID=4


join kunde on kunde.ID_Kunde = rechnung.FK_Empfaenger
and rechnung.FK_Empfaenger =2

Dann kommt: Not unique table/alias: 'kunde'


Wie kann ich das lösen?
Danke für eure Vorschläge :)
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Mi 03.11.10 10:52 
Hi,

da wirst Du ohne Unter-Selects nicht weiterkommen.
Mit Unter-Selects würde das Ganze dann so aussehen:
ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
SELECT rechnung.Rechnungsnummer, 
(SELECT kunde.Vorname FROM kunde WHERE kunde.ID_Kunde = rechnung.FK_Kunde_ID) AS KundenVorname,
(SELECT kunde.Name FROM kunde WHERE kunde.ID_Kunde = rechnung.FK_Kunde_ID) AS KundenNachname,
(SELECT kunde.Vorname FROM kunde WHERE kunde.ID_Kunde = rechnung.FK_Empfaenger_ID) AS EmpfaengerVorname,
(SELECT kunde.Name FROM kunde WHERE kunde.ID_Kunde = rechnung.FK_Empfaenger_ID) AS EmpfaengerNachname,
re_positionen.ID_Pos
FROM rechnung INNER JOIN re_positionen 
ON re_positionen.FK_RE_ID = rechnung.Rechnungsnummer
WHERE rechnung.Rechnungsnummer = 3;

Kann sein, dass die Bezeichner z.T. falsch sind.

LG, Marko

Für diesen Beitrag haben gedankt: BLR
BLR Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: Mi 03.11.10 11:31 
Cool, ich danke dir sehr für die Abfrage, habe sie soweit angepasst,
dass sie läuft:

ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
SELECT rechnung.Rechnungsnummer, 
(SELECT kunde.Vorname FROM kunde WHERE kunde.ID_Kunde = rechnung.FK_Kunde_ID
and rechnung.FK_Kunde_ID=4) AS KundenVorname,
(SELECT kunde.Name FROM kunde WHERE kunde.ID_Kunde = rechnung.FK_Kunde_ID
and rechnung.FK_Kunde_ID=4) AS KundenNachname,
(SELECT kunde.Vorname FROM kunde WHERE kunde.ID_Kunde = rechnung.FK_Empfaenger
and rechnung.FK_Empfaenger =2) AS EmpfaengerVorname,
(SELECT kunde.Name FROM kunde WHERE kunde.ID_Kunde = rechnung.FK_Empfaenger
and rechnung.FK_Empfaenger =2) AS EmpfaengerNachname,
re_positionen.ID_Pos
FROM rechnung INNER JOIN re_positionen 
ON re_positionen.FK_RE_ID = rechnung.ID_RE
WHERE rechnung.ID_RE =3;


Mit "Unter-Selects" habe ich noch nicht gearbeitet :(
Hab vielen dank
BLR Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: Mi 03.11.10 12:06 
Ich muss noch eben eine Join-Anweisung dazu machen,
aber irgendwie will das nicht so recht mit den diesen "Unter-Selects" zusammenarbeiten.
ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
SELECT rechnung.Rechnungsnummer, [b]artikel.Artikel_Bezeichnung[/b]
(SELECT kunde.Vorname FROM kunde WHERE kunde.ID_Kunde = rechnung.FK_Kunde_ID
and rechnung.FK_Kunde_ID=4) AS KundenVorname,
(SELECT kunde.Name FROM kunde WHERE kunde.ID_Kunde = rechnung.FK_Kunde_ID
and rechnung.FK_Kunde_ID=4) AS KundenNachname,

(SELECT kunde.Vorname FROM kunde WHERE kunde.ID_Kunde = rechnung.FK_Empfaenger
and rechnung.FK_Empfaenger =2) AS EmpfaengerVorname,

(SELECT kunde.Name FROM kunde WHERE kunde.ID_Kunde = rechnung.FK_Empfaenger
and rechnung.FK_Empfaenger =2) AS EmpfaengerNachname,
re_positionen.ID_Pos

FROM rechnung, artikel

INNER JOIN re_positionen 
ON re_positionen.FK_RE_ID = rechnung.ID_RE
WHERE rechnung.ID_RE =3

[b]join artikel on re_positionen.FK_Art_ID = artikel.ID_Art
and re_positionen.FK_Art_ID = 45[/b]


In der Tabelle "re_positionen" befinden sich die fremdschlüsseln "ID" von dem Primär-Schlüsseln in der Tabelle "Artikel"
Also sprich: re_positionen.FK_Art_ID = artikel.ID_Art

Der Join an sich sollte richtig sein, aber in Verbindung mit "Unter-Select" geht das irgendwie nicht, hab schon probiert, die abfrage an verschiedenen stellen reinzuschreiben, brachte mir aber nix.
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Mi 03.11.10 14:39 
Hi,

so?
ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
SELECT rechnung.Rechnungsnummer, re_positionen.ID_Pos, artikel.Artikel_Bezeichnung,
(SELECT kunde.Vorname FROM kunde WHERE kunde.ID_Kunde = rechnung.FK_Kunde_ID) AS KundenVorname,
(SELECT kunde.Name FROM kunde WHERE kunde.ID_Kunde = rechnung.FK_Kunde_ID) AS KundenNachname,
(SELECT kunde.Vorname FROM kunde WHERE kunde.ID_Kunde = rechnung.FK_Empfaenger) AS EmpfaengerVorname,
(SELECT kunde.Name FROM kunde WHERE kunde.ID_Kunde = rechnung.FK_Empfaenger) AS EmpfaengerNachname
FROM rechnung INNER JOIN re_positionen 
ON re_positionen.FK_RE_ID = rechnung.Rechnungsnummer INNER JOIN artikel
ON re_positionen.FK_ART_ID = artikel.ID_Art
WHERE rechnung.Rechnungsnummer = 3 AND
rechnung.FK_Kunde_ID = 4 AND
rechnung.FK_Empfaenger = 2 AND
rechnung.ID_RE = 3 AND
re_positionen.FK_Art_ID = 45;


Habe mal noch die ganzen Einschränkungen aus den Unterselects genommen und diese ganz an das Ende gepackt. Glaube, die haben an dieser Stelle nichts zu suchen, und so sparst Du Dir auch ein paar AND's.

LG, Marko

Für diesen Beitrag haben gedankt: BLR
BLR Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: Mi 03.11.10 19:51 
super, hab vielen dank,
deine abfrage hat mich auf meine eigene idee gebracht^^
Deine Abfrage funktioniert aber es liefert mir keinen Wert zurück, da sind bestimmt irgendwie falsche spalten miteinander vergliechen worden.

Ich habe nun an meiner eigenen gebastelt, die auch funktioniert bis auf eine Kleinigkeit:

ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
SELECT rechnung.Rechnungsnummer, re_positionen.ID_Pos, 
(SELECT kunde.Vorname FROM kunde WHERE kunde.ID_Kunde = rechnung.FK_Kunde_ID and rechnung.FK_Kunde_ID=4) AS KundenVorname,
(SELECT kunde.Name FROM kunde WHERE kunde.ID_Kunde = rechnung.FK_Kunde_ID and rechnung.FK_Kunde_ID=4) AS KundenNachname,
(SELECT kunde.Vorname FROM kunde WHERE kunde.ID_Kunde = rechnung.FK_Empfaenger and rechnung.FK_Empfaenger =2) AS EmpfaengerVorname,
(SELECT kunde.Name FROM kunde WHERE kunde.ID_Kunde = rechnung.FK_Empfaenger and rechnung.FK_Empfaenger =2) AS EmpfaengerNachname,
(SELECT artikel. Artikel_Bezeichnung FROM artikel where re_positionen.FK_ART_ID  = artikel.ID_Art or re_positionen.FK_Art_ID = 45
[b]or re_positionen.FK_Art_ID = 37[/b]) AS Artikel

FROM rechnung 
INNER JOIN re_positionen ON re_positionen.FK_RE_ID = rechnung.ID_RE
WHERE rechnung.ID_RE =3


Wenn ich das dick-markierte noch zusätzlich einfüge (weil ich eben mehrere Artikeln in der Rechnung habe, darum hab ich es mir OR verbunden)
kommt folgendes: Subquery returns more than 1 row
Also heisst es, dass er mehr als einen Wert zurückgibt
Wenn ich statt OR ein AND mache, kommen überall NULL raus, bei den Artikeln

in der Tabelle RE_pos hab ich fremdschlüssel von der Rechnung=3
und im selben Datensatz der selben Tabelle habe ich fremdschlüssel von der Artikeltabelle =45
und dann noch der selber Datensatz aber dann ist der Fremdschlüssel der Artikeltabelle =37

Dann wähle ich ja mir OR entweder 45 oder 37, aber dann kommt wie gesagt: Subquery returns more than 1 row
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Mi 03.11.10 20:16 
Hallo,

also erstmal muss ich was richtigstellen, was ich aber vorhin nicht so toll probieren konnte, da ich auf Arbeit war :( :
Es funktioniert doch ohne Unterselects, wenn man in einer Tabelle 2 Fremdschlüssel auf eine andere Tabelle hat. Angenommen, wir haben das Modell:
DbDiagram
Dann könnte eine Abfrage auf Kundenname und -vorname und Empfängername und -vorname so aussehen:
ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
SELECT     k.Name AS Kundenname, 
          k.Vorname AS KundenVorname, 
          e.Name AS Empfängername
          e.Vorname AS Empfängervorname
FROM      Kunde k INNER JOIN Rechnungen r 
ON        k.ID_Kunde = r.FK_Kunde_ID INNER JOIN Kunde e 
ON        e.ID_Kunde = r.FK_Empfaenger_ID;

Die Tabellenbezeichner auf die Tabelle "Kunde" müssen nur verschieden sein.
Ist vielleicht ein bisschen schöner als die Unterselects.

Das andere, was Du geschrieben hast, muss ich erstmal verinnerlichen...

//edit: Bild als Inline eingebungen. Jetzt weiß ich, wie es geht :wink:

LG, Marko
Einloggen, um Attachments anzusehen!


Zuletzt bearbeitet von Trashkid2000 am So 21.11.10 11:06, insgesamt 1-mal bearbeitet
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Do 04.11.10 07:55 
Moin,

also, bei einem Unterselect darf genau ein Wert "rausfallen". Und bei dem Unterselect
ausblenden SQL-Anweisung
1:
(SELECT artikel.Artikel_Bezeichnung FROM artikel WHERE re_positionen.FK_ART_ID = artikel.ID_Art OR re_positionen.FK_Art_ID = 45 OR re_positionen.FK_Art_ID = 37AS Artikel					
wären ja bis zu 3 Werte möglich.

Also, Du möchtest, dass
re_positionen.FK_ART_ID = artikel.ID_Art, denn das ist die Beziehung,
UND re_positionen.FK_Art_ID = 45 ODER re_positionen.FK_Art_ID = 37

Das so eingeklammert, wie der Ausdruck auch gemeint ist, würde es so aussehen:
ausblenden SQL-Anweisung
1:
(SELECT artikel.Artikel_Bezeichnung FROM artikel WHERE re_positionen.FK_ART_ID = artikel.ID_Art AND (re_positionen.FK_Art_ID = 45 OR re_positionen.FK_Art_ID = 37)) AS Artikel					
Aber dabei kann natürlich auch NULL rausfallen.

LG, Marko
BLR Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: Do 04.11.10 10:00 
ahh super, ok, ich habs jetzt hinbekommen.
Die vollständige Abfrage ist so:


ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
SELECT rechnung.Rechnungsnummer,
(SELECT kunde.Vorname FROM kunde WHERE kunde.ID_Kunde = rechnung.FK_Kunde_ID and rechnung.FK_Kunde_ID=4) AS KundenVorname,
(SELECT kunde.Name FROM kunde WHERE kunde.ID_Kunde = rechnung.FK_Kunde_ID and rechnung.FK_Kunde_ID=4) AS KundenNachname,
(SELECT kunde.Vorname FROM kunde WHERE kunde.ID_Kunde = rechnung.FK_Empfaenger and rechnung.FK_Empfaenger =2) AS EmpfaengerVorname,
(SELECT kunde.Name FROM kunde WHERE kunde.ID_Kunde = rechnung.FK_Empfaenger and rechnung.FK_Empfaenger =2) AS EmpfaengerNachname,
(SELECT artikel.Artikel_Bezeichnung FROM artikel where re_positionen.FK_ART_ID  = artikel.ID_Art and (re_positionen.FK_Art_ID = 45 
or re_positionen.FK_Art_ID = 37 )) AS Artikel

FROM rechnung 
INNER JOIN re_positionen ON re_positionen.FK_RE_ID = rechnung.ID_RE
WHERE rechnung.ID_RE =3


und noch mal zu deiner vorherigen Abfrage:

ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
SELECT     
          k.Name AS Kundenname, 
          k.Vorname AS KundenVorname, 
          e.Name AS Empfängername
          e.Vorname AS Empfängervorname
FROM      Kunde k INNER JOIN Rechnungen r 
ON        k.ID_Kunde = r.FK_Kunde_ID 
          INNER JOIN Kunde e 
ON        e.ID_Kunde = r.FK_Empfaenger_ID;


also man muss einfach ein neues Objekt: Kunde k bzw. Kunde e
erzeugen.
BLR Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: Do 04.11.10 11:09 
ok...deine vorherige Abfrage gefällt mir besser.
Ich habe nun 3 seperate joins nach dieser Methode erstellt.
Davon bekomme ich 2 zusammengesetzt, aber den kriege ich nicht angehängt:


1
ausblenden volle Höhe SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
SELECT      k.Name AS Kundenname, 
              k.Vorname AS KundenVorname,
     k.Ort AS Ort,
      k.PLZ AS Postleitzahl,
      k.Straße as Straße,
    k.Telefonnummer as Telefonnummer,
    
e.Name AS Kundenname, 
              e.Vorname AS KundenVorname,
     e.Ort AS Ort,
      e.PLZ AS Postleitzahl,
      e.Straße as Straße,
    e.Telefonnummer as Telefonnummer,

    r.Rechnungsnummer,
    r.ZahlDatum,
    r.Datum
                  
FROM        Kunde k



INNER JOIN Rechnung r
ON          k.ID_Kunde = r.FK_Kunde_ID 
      and r.FK_Kunde_ID = 4


INNER JOIN Kunde e 
ON          e.ID_Kunde = r.FK_Empfaenger
      and r.FK_Empfaenger = 2


INNER JOIN   re_positionen re
ON    re.FK_RE_ID = r.ID_RE
    where r.ID_RE=3



Den dritten Join bekomme ich aber nicht an die zwei anderen angehägt:

ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
select  a.Artikel_Bezeichnung,
  a.Abhol_Preis,
  rea. Artikel_Anzahl,
  rea.ArtikelPfand
from   artikel a
  INNER JOIN re_positionen rea
ON  rea.FK_ART_ID = a.ID_Art
  where rea.FK_Art_ID = 45 
  or rea.FK_Art_ID = 37


Wenn ich die Tabelle artikel a bei dem "From"-Teil (Kunde k, artikel a) kommt ein fehler, das einzige was mir noch einfallen kann ist: INNER JOIN re_positionen rea,
artikel a
aber das geht ja auch nicht.

Danke im Voraus
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Fr 12.11.10 08:07 
Hallo,

hatte erst eben gesehen, dass Du noch was geschrieben und ein Problem hast, sorry.
Hast Du denn jetz schon eine Lösung gefunden?

Ansonsten sollte es eigentlich so gehen:
ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
SELECT     
  k.Name AS Kundenname, 
  k.Vorname AS KundenVorname,
  k.Ort AS Ort,
  k.PLZ AS Postleitzahl,
  k.Straße as Straße,
  k.Telefonnummer as Telefonnummer,   
  e.Name AS Kundenname, 
  e.Vorname AS KundenVorname,
  e.Ort AS Ort,
  e.PLZ AS Postleitzahl,
  e.Straße as Straße,
  e.Telefonnummer as Telefonnummer,
  r.Rechnungsnummer,
  r.ZahlDatum,
  r.Datum
  a.Artikel_Bezeichnung,
  a.Abhol_Preis,
  re.Artikel_Anzahl,
  re.ArtikelPfand             
FROM        
  Kunde k
 
INNER JOIN Rechnung r ON k.ID_Kunde = r.FK_Kunde_ID
INNER JOIN Kunde e ON e.ID_Kunde = r.FK_Empfaenger
INNER JOIN re_positionen re ON re.FK_RE_ID = r.ID_RE
INNER JOIN artikel a ON re.FK_Art_ID = a.ID_Art
 
WHERE r.ID_RE = 3 AND r.FK_Kunde_ID = 4 AND r.FK_Empfaenger = 2;


Oder auch anders geschrieben:
ausblenden volle Höhe SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
SELECT     
  k.Name AS Kundenname, 
  k.Vorname AS KundenVorname,
  k.Ort AS Ort,
  k.PLZ AS Postleitzahl,
  k.Straße as Straße,
  k.Telefonnummer as Telefonnummer,   
  e.Name AS Kundenname, 
  e.Vorname AS KundenVorname,
  e.Ort AS Ort,
  e.PLZ AS Postleitzahl,
  e.Straße as Straße,
  e.Telefonnummer as Telefonnummer,
  r.Rechnungsnummer,
  r.ZahlDatum,
  r.Datum
  a.Artikel_Bezeichnung,
  a.Abhol_Preis,
  re.Artikel_Anzahl,
  re.ArtikelPfand             
FROM        
  Kunde k, Kunde e, Rechnung r, re_positionen re, artikel a

WHERE
  --die Relationen
  k.ID_Kunde = r.FK_Kunde_ID AND 
  e.ID_Kunde = r.FK_Empfaenger AND
  re.FK_RE_ID = r.ID_RE AND
  re.FK_Art_ID = a.ID_Art AND 
  --Deine Einschränkungen
  r.ID_RE = 3 AND 
  r.FK_Kunde_ID = 4 AND
  r.FK_Empfaenger = 2;

Wenn es dabei noch Fehler gibt, poste mal bitte den Fehlertext, der zurückgegeben wird.

LG, Marko