2 Tabellen mischen

Hallo,

folgedenes habe ich in MS Access erstellt:
Tabelle 1:
Datum
Betrag
Beschreibung

Tabelle 2:
Datum
Kosten
Text

nun möchte ich eine Ausgabe (Abfrage) haben, die mir alle Felder ausgibt, also

Abfrage
Datum
Betrag
Kosten

Es sollen also alle Daten aus Tabelle 1 und 2 aufgelistet werden, und falls vorhanden dazu der Betrag bzw. die Kosten.

Also als Bsp.:
Tabelle 1:
01.01.2004; 3,00; Test 1
01.02.2004; 5,00; Test 2
01.03.2004; 3,00; Test 3

Tabelle 2
01.01.2004; 5,00; Eintrag A
15.02.2004; 4,00; Eintrag B
01.03.2004; 1,00; Eintrag C

Dann sollte die Abfrage wie folgt aussehen:

Abfrage
01.01.2004; 3,00; 5,00
01.02.2004; 5,00; -----
15.02.2004; -----; 4,00
01.03.2004; 3,00; 1,00

Puh, hoffe das war/ist so verständlich…

Kann ich das ganze bewerkstelligen, ohne eine extra Tabelle zu machen, wo jedes mögliche Datum eingetragen ist???

Wie geht’s am einfachsten???

Vielen Dank und Gruß

Marcel

Moien!

Du musst mit sql eine Abfrage erstellen wo du mit left join (oder right da verwechsel ich mich immer ;o)) von Tabelle 1 auf tabelle 2 zugreifst. Dazu dann das gleiche von Tabelle 2 auf 1. diese verknüpfst du dann im sql per union.

Bernd

Hallo Bernd,

Du musst mit sql eine Abfrage erstellen wo du mit left join
(oder right da verwechsel ich mich immer ;o)) von Tabelle 1
auf tabelle 2 zugreifst. Dazu dann das gleiche von Tabelle 2
auf 1. diese verknüpfst du dann im sql per union.

Eine Möglichkeit, das ich die SQL-Befehle nicht per Hand tippen muss gibt es nicht? Also, in dem Ich die Beziehungen zw. den Tabellen irgendwie anpasse?

Ansonsten muss ich mir die SQL Geschichte mal ansehen, kann mit Sicherheit auch nicht schaden.

Danke und Gruß

Marcel

hi!

Eine Möglichkeit, das ich die SQL-Befehle nicht per Hand
tippen muss gibt es nicht? Also, in dem Ich die Beziehungen
zw. den Tabellen irgendwie anpasse?

wenn ich mich nicht allzusehr täusche, müßte das in access per klick-klick funktionieren

Ansonsten muss ich mir die SQL Geschichte mal ansehen, kann
mit Sicherheit auch nicht schaden.

das wäre sogar empfehlenswert :wink:

grüße,
tomh

Moien!

hi!

Eine Möglichkeit, das ich die SQL-Befehle nicht per Hand
tippen muss gibt es nicht? Also, in dem Ich die Beziehungen
zw. den Tabellen irgendwie anpasse?

wenn ich mich nicht allzusehr täusche, müßte das in access per
klick-klick funktionieren

Access kann keine Union-Abfragen in dieser Form soweit ich weiß ;o)

Ansonsten muss ich mir die SQL Geschichte mal ansehen, kann
mit Sicherheit auch nicht schaden.

Naja, wenn du irgendwann mal programmieren können willst geht ohne sql rein gar nichts oder man machts wieviele meiner Vorgänger die sql-blödsinn zusammenstrickten, sodaß ein programm zum starten minuten brauchte statt sekunden…

Bernd

Moien!

mahlzeit!

wenn ich mich nicht allzusehr täusche, müßte das in access per
klick-klick funktionieren

Access kann keine Union-Abfragen in dieser Form soweit ich
weiß ;o)

ich nehme - nachdem ich mir das ursprungsposting nochmals durchlas - noch immer an, daß es sich hier um einen join und nicht um ein union handelt - by the way: sql-mäßig ist ein union kein problem für access

ich glaube nicht, daß er mit einem union den betrag und die kosten in eine ergebnis-zeile bringen kann :wink:

in sql gesprochen:

select a.datum,a.betrag,b.kosten
 from tab1 a, tab2 b
 where a.datum = b.datum

(ev. gehört noch ein outer-join rein)

Naja, wenn du irgendwann mal programmieren können willst geht
ohne sql rein gar nichts

vor allem, wenn man dann in access sogar selects und updates und inserts und deletes schnell mal für ein paar tausend sätze durchführt - ja, ich weiß, es geht auch per „suchen und ersetzen“ und fürs ansehen der tabellendaten muß ich nicht extra eine select-abfrage basteln, aber darauf stieß ich sql-trottel immer erst zu spät - ohne die „abfragen“ in „sql-ansicht“ wäre ich access hilflos ausgeliefert :wink:

grüße,
tomh

Rehi…

Kein Mensch hört mir zu *ggg

Erbraucht imho sowohl joins als auch union da nicht in beiden tabellen die gleichen Tage vorkommen und bei zwei verschiedenen joins per union verbunden hat er dann auch die werte ;o)

Bernd

hi!

Kein Mensch hört mir zu *ggg

doch doch - aber heute brauch ich anscheinend doch etwas länge :wink:

Erbraucht imho sowohl joins als auch union da nicht in beiden
tabellen die gleichen Tage vorkommen und bei zwei
verschiedenen joins per union verbunden hat er dann auch die
werte ;o)

*grmpf* lesen und _drüber_lesen sind ja doch verschiedene dinger …

grüße,
ein sich schämender tomh

Hallo!

Nun zur Lösung des ganzen. Ich gehe mal von erstgenannter Tabellenstruktur aus.

Speichert dann folgende

Abfrage1:

SELECT Tabelle1.Datum, Tabelle1.Betrag, Tabelle2.Kosten
FROM Tabelle1 LEFT JOIN Tabelle2 ON Tabelle1.Datum = Tabelle2.Datum

Dann

Abfrage2:

SELECT Tabelle2.Datum, Tabelle1.Betrag, Tabelle2.Kosten
FROM Tabelle2 LEFT JOIN Tabelle1 ON Tabelle2.Datum = Tabelle1.Datum

Daraus dann die

UNION-Abfrage3:

SELECT Abfrage1.\* FROM Abfrage1 UNION select \* from Abfrage2

Und feddisch is die Lauge.

Zum Erstellen der ersten beiden Abfragen ohne die fundierten SQL-Kenntnisse: Lege eine neue Abfrage an, mach die Entwurfsansicht auf, klicke Dir beide Tabellen Tabelle1 und Tabelle2 nach oben, markiere „Datum“ in Tabelle1, ziehe es per Zerr-und-plumps auf das „Datum“ in Tabelle2. Du erhältst einen Strich mit zwei kleineren Knubbeln am Ende. Klicke mit der rechten Maustaste auf den Strich, wähle „Verknüpfungseigenschaften“ und Option 2: „Alle aus Tabelle1 und nur die aus Tabelle2, bei denen Inhalte gleich“. Das ist dann das LEFT JOIN der obigen SQL-Anweisung. Klick Dir per Doppelklick die gewünschten Felder nach unten.
Das ganze wiederholst Du für die zweite Abfrage. Ziehe entweder „Datum“ aus Tabelle2 auf „Datum“ aus Tabelle1 und wähle ebenso die gleiche Option wie oben. Oder ziehe wieder „Datum“ aus Tabelle1 auf „Datum“ aus Tabelle2, wähle aber Option 3: „Alle aus Tabelle2 und nur die aus Tabelle1,…“.

Für die UNION-Abfrage gibt es leider keinen Klickklick-Assistenten. Aber die Anweisung ist ja auch nicht sooo spannend und ggf. leicht manuell eingebbar.

Ach ja, Sortierungen nach eigenen Gusto in der UNION-Abfrage am Ende mit "order by ".

Und noch was: Wenn Du statt der NULL bei Datensätzen, die nicht vorhanden sind, „-“ haben willst, lautet der SQL-Befehl für die Abfragen Abfrage1 und Abfrage2:

SELECT Tabelle1.Datum, Tabelle1.Betrag AS BetragNN, IIf(IsNull([Kosten]),"-",[Kosten]) AS KostenNN
FROM Tabelle1 LEFT JOIN Tabelle2 ON Tabelle1.Datum = Tabelle2.Datum


SELECT Tabelle2.Datum, IIf(IsNull([Betrag]),"-",[Betrag]) AS BetragNN, Tabelle2.Kosten AS KostenNN
FROM Tabelle2 LEFT JOIN Tabelle1 ON Tabelle2.Datum = Tabelle1.Datum

Beachte, dass zwei mal Alias-Feldnamen mit „NN“ (wie „Nicht NULL“) am Ende verwendet werden. Dies ist nötig, um bei der Funktion mit IsNull keinen Zirkelbezug zu erzeugen. Außerdem werden beide Nicht-Datums-Felder mit Aliasnamen versehen, obwohl pro Abfrage theoretisch nur einer benötigt wird. Da dies aber wechselseitig der andere ist (ein mal Betrag, ein mal Kosten), verwende ich hier beide der Übersichtlichkeit halber. Für die UNION-Abfrage wäre das aber nicht zwingend erforderlich. So habe ich zwei identisch aussehende Abfragen, die ich ggf. auch in einer Tabellenerstellungsabfrage benutzen könnte. Und egal welche ich dazu verwende, ich erhalte die gleiche Tabelle.

Ach ja: Bei den Funktionen mit „IsNull“: Beachte, dass die Verwendung dieser sich u. U. von SQL-Dialekt zu SQL-Dialekt unterscheiden mag. Wenn Du die Abfragen auf einer Oracle-DB laufen lassen willst, muss das nicht unbedingt funktionieren.

Gruß, Manfred

oh graus!!
Moien!

Niemals über drei Abfragen gehen, denn das frisst erheblich Performance! Alles gehört in eine einzelne Abfrage!

Bernd

Tach!

Niemals über drei Abfragen gehen, denn das frisst erheblich
Performance!

Make it work before you make it fast.

SELECT Tabelle1.Datum, Tabelle1.Betrag AS Betrag, IIf(IsNull([Kosten]),"-",[Kosten]) AS KostenNN FROM Tabelle1 
LEFT JOIN Tabelle2 ON Tabelle1.Datum = Tabelle2.Datum UNION SELECT Tabelle2.Datum, IIf(IsNull([Betrag]),"-",[Betrag]) AS BetragNN, Tabelle2.Kosten FROM Tabelle2 LEFT JOIN Tabelle1 ON Tabelle2.Datum = Tabelle1.Datum

kann auch in einer Abfrage zusammengefasst werden. Ist aber nicht unbedingt das einfachste Mittel, um zu erklären, wie es funktioniert, zumal das einzig positive an Access, nämlich der Abfragenassistent/Entwurfsansicht, für das gewünschte Resultat wg. UNION nicht ausreicht.

Alles gehört in eine einzelne Abfrage!

War’s doch:wink: Das LEFT JOIN war in einer einzelnen, das RIGHT JOIN in einer einzelnen und die UNION in einer einzelnen Abfrage. Oben steht’s dann in einer einzigen Abfrage .

Und im Zusammenhang mit Access den Begriff „Performance“ zu verwenden, finde ich gewagt, da ich mit Performance eine gewisse Geschwindigkeit, weniger eine Geh-schwindigkeit, assoziiere… Und gerade bei so komisch verschachtelten Abfragen mit JOINs drin habe ich die Erfahrung gemacht, dass der Spaß teilweise schneller wird, wenn mach sich die entsprechenden Abfragenresultate wirklich in eine separate Tabelle zwischenspeichert. Auch sind die JOINs per se schon höllenmäßig langsam und werden darüber hinaus nicht von allen SQL-Dialekten (z. B. Oracle; jedenfalls bei den alten Versionen, die ich mal in der Mangel hatte, war’s so) unterstützt. Insofern wäre die Verwendung von IN/EXISTS nicht nur kompatibler, sondern auch performanter.

Gruß, Manfred

Hallo
Mafred, Bernd und Tom,
glaube das waren alle, oder? *g*
erstmal Danke euch allen für die, ich denke hilfreichen Beiträge.

Hab da ja mal was schönes breitgetreten *freu*

Ich werde die verschiedenen Möglichkeiten bei Gelgenheit ausprobieren, nachdem ich die DB neu erstellt habe (sch*** Verschlüsselungssoftware lol)

Also, habt vielen Dank
und Gruß

Marcel