# Problem mit einer Abfrage



## starbug (12. Dezember 2011)

Hallo Leute,

ich habe ein kleines Problem. Ich habe mehrere Tabellen mit einer 1:n Verbindung. Hier nun mein Problem. Ich habe eine Tabelle Artikel mit ca. 240 Artikelnummern. Diese ist mit einer Tabelle namens Lieferanten verbunden, wie bereits gesat mit einer 1:n Verbindung. Wenn ich nun eine Abfrage durchführe, die mir einfach nur alle Artikelnummern zeigen soll, bekomme ich nicht 240 angezeigt sondern nur 170. Und wenn ich diese Abfrage mit der Lieferantentabelle durchführe bekomme ich wieder nicht alle angezeigt und sogar doppelte einträger der Artikelnummern. WAs läuft da falsch?


----------



## Yaslaw (12. Dezember 2011)

*item:* Es handelt sich wohl um MS Access und nicht um Excel oder sontwas

*item:* Du musst die 2 Tabellen mit einem LEFT JOIN verknüpfen. ggf mit einem DISTINCT oder einem GROUP BY auf die Artikelnummern reduzieren

*item:* Wir können dir besser zeigen, wenn du a) deine Abfragen besser beschreibst oder b) dein SQL-Code mal zeigst


----------



## starbug (12. Dezember 2011)

Also du hast recht es handelt sich um Access.



```
SELECT Artikel.ArtikelNr, Tabelle1.Feld1, Tabelle1.Feld2, Tabelle1.Feld3, Tabelle1.Feld4, Tabelle2.Feld1, Tabelle2.Feld2, Tabelle2.Feld3
FROM ((((((Artikel INNER JOIN Tabelle2 ON Artikel.ArtikelNr = Tabelle2.ArtikelNr) INNER JOIN Tabelle1 ON artikel.ArtikelNr = Tabelle1.ArtikelNr)
```

So sieht das aus, habe die Tabellen ein wenig umbenannt.


----------



## tombe (12. Dezember 2011)

> Wenn ich nun eine Abfrage durchführe, die mir einfach nur *alle* Artikelnummern zeigen soll, bekomme ich nicht 240 angezeigt sondern nur 170



Also wenn nur 170 angezeigt werden, bedeutet das ja das irgendein WHERE Argument greift. Wenn du aber alle 240 Datensätze anzeigen willst, dann frage die Datensätze einfach so ab:


```
SELECT artikelnummer FROM deine_tabelle
```

Denke aber nicht das es das ist was du haben willst!?


----------



## Yaslaw (12. Dezember 2011)

Ja, Access ist unfähig SQL-Code sauber darzustellen. Aber wennm an den Code formatiert, sieht man, dass du ein INNER JOIN drin hast. Dieser grenzt die Artikelmenge auf die Artikel der Tabelle1 ein. Ergo werde nur Artikel ausgegeben, die in Tabelle1 vorhanden sind. Dasselbe mit der Tabelle2. Als Resultat kriegst du also nur die Artikell welche in Tabelle1 UND Tabelle2 vorhanden sind
Ändere diese zu LEFT JOIN und du kriegst alle Artikel der Artikeltabelle


```
SELECT 
	Artikel.ArtikelNr, 
	Tabelle1.Feld1, 
	Tabelle1.Feld2, 
	Tabelle1.Feld3, 
	Tabelle1.Feld4, 
	Tabelle2.Feld1, 
	Tabelle2.Feld2, 
	Tabelle2.Feld3
FROM 
	Artikel 
	LEFT JOIN Tabelle2 ON 
		Artikel.ArtikelNr = Tabelle2.ArtikelNr
	LEFT JOIN Tabelle1 
		ON artikel.ArtikelNr = Tabelle1.ArtikelNr
```


----------



## starbug (12. Dezember 2011)

Hmm,

also ich verstehe was Ihr meint aber es funktioniert nicht. Also vielleicht habe ich mich am Anfang falsch ausgedrückt. Ich habe so 240 Artikelnummern: Davon haben aber nur ca. 70 Nummern mehr details. Wenn ich also eine Abfrage mit der Artikeltabelle und zwei weiteren verknüpften Tabellen machen, dann dürften in der View auch nur 70 Artikel mit den passenden Details stehen.

Für ich die Abfrage mit einem INNER JOIN durch, so bekomme ich ca. 100 Artikel angezeigt.

Die gleiche Abfrage mit einem LEFTJOIN zeigt mir dann natürlich alle 240 Artikel an.


----------



## Yaslaw (12. Dezember 2011)

Nö. Nicht bei einer 1:n-Beziehung.

Wenn du auf einen Artikel, 2 Einträge in der Tabelle1 hast, dann gibt das bereits 2 Zeilen. Wenn du noch 3 Einträge zur selben Artikelnummer in der Tabelle2, dann werden daraus 6 Zeilen.


Du kommst nur auf 70, wenn du eine 1:1 Beziehung hast.

Mein Beispiel von oben in Fakten:

```
Artikel:
ArtikelNr
---------
1
2

Tabelle1:
ArtikelNr | id1
---------------
1         | 11
1         | 12
2         | 21

Tabelle2:
ArtikelNr | id2
---------------
1         | 201
1         | 202
1         | 203

Resultat deines SQLs mit INNER JOIN
ArtikelNr | id1 | id2
---------------------
1         | 11  | 201
1         | 11  | 202
1         | 11  | 203
1         | 12  | 201
1         | 12  | 202
1         | 12  | 203
```
Also, welche der 6 Zeilen zu ArtikelNr 1 soll nun gezählt werden?


----------



## tombe (12. Dezember 2011)

Dann sag uns doch mal wie die einzelnen Tabellen aufgebaut sind und über welches Feld sie miteinander verknüpft sind.


----------



## Yaslaw (12. Dezember 2011)

tombe hat gesagt.:


> ... und über welches Feld sie miteinander verknüpft sind.


[ArtikelNr]. Siehe sein SQL


----------



## starbug (12. Dezember 2011)

Also ich habe mal eine ganz kleine Test DB angehängt. Wenn ich meine Abfragen dort durchführe funktioniert es auch. Aber man muss sich das so vorstellen das an den Detail Tabellen noch weitere Tabellen hängen.


----------



## starbug (12. Dezember 2011)

Und ich sollte erwähenen das sich im Verlauf der anderen Tabellen der Primärschlüssel ändert oder manchmal gar keiner vorhanden ist, da ich manche Tabellen per Abfrage erstellt habe.


----------



## Yaslaw (12. Dezember 2011)

Sorry, ich öffne aus Sicherheitsgründen keine fremden DBs. (Makros und Anderes)

Aber ev. hast du ja mal Lust zu beschreiben (am besten mit einem Beispiel) Was du hast und was du willst.
Siehe dazu mein Beispiel oben wo ich ein Beispiel machte mit meiner Annahme, was du hast.

Achja, ohne Antwort auf Post #7 gibts auch keine weitere Hilfe von meiner Seite.


----------



## starbug (12. Dezember 2011)

Also zu deinem Post #7. Du lässt dir ja alles anzeigen was ArtikelNr 1 hat. Ich möchte aber das alle Artikel angezeigt werden zu denen es weitere Details gibt. Kann ich hier nen Screeshot posten? Das wäre glaub ich am besten.


----------



## Yaslaw (12. Dezember 2011)

Mach ein Beispiel. 
Deine Erklärungen widersprechen sich seit dem ersten Posting und verwirren immer mehr.

Wie so ein Beispiel aussehen kann siehst du im Post #7.

Also, ich Versuchs trotzdem. Ich vergesse einfach mal was du bisher geschrieben hast und betrachte nur dein SQL und deine letzte Aussage (Post #13).
Warum gibtst du Felder der Tabelle1 und Tabelle2 aus? Wenn du diese Felder weglässt, kannst du einen DISTINCT anwenden. Aber nur wenn du keine Ausgabe der Tabelle1 und Tabelle2 machst. Denn nur dann hast du je eine eindeutige Zeile pro Artikelnummer welche in beiden anderen Tabellen vorhanden ist.

```
SELECT DISTINCT
    Artikel.ArtikelNr
FROM 
    Artikel 
    INNER JOIN Tabelle2 ON 
        Artikel.ArtikelNr = Tabelle2.ArtikelNr
    INNER JOIN Tabelle1 
        ON artikel.ArtikelNr = Tabelle1.ArtikelNr
```


----------



## tombe (12. Dezember 2011)

starbug hat gesagt.:


> Kann ich hier nen Screeshot posten? Das wäre glaub ich am besten.



Ja in dem du ihn als Bild speicherst und dieses dann hier einstellst.


----------



## starbug (12. Dezember 2011)

@ Yaslaw : Ich versteh nur nicht wieso das bei einer einfachen Tabelle funktioniert und bei meiner halt nicht. 

Ich hab hier mal den Screenshot.


----------



## starbug (12. Dezember 2011)

Ups, hier ist er:


----------



## Yaslaw (12. Dezember 2011)

*item: *Die Antwort auf deine Frage in #16 habe ich mit meinem Datenbeispiel erläutert - wenn nicht, dann vesteh ich deine Frage nicht.

*item: * Diese Grafik ist immer noch kein Beispiel.

Ich gebs auf. Wir drehen uns im Kreis. Andere bitte weitermachen.


----------



## starbug (12. Dezember 2011)

OK ich werd morgen versuchen, hab jetzt feierabend , aber trotzdem danke für die Hilfe.


----------

