• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

SQL(o. Access): Tabellen mergen zum Export?

philo

Roter Stettiner
Registriert
13.10.04
Beiträge
973
Hallo,

ich hoffe mir kann jemand helfen. Ich stehe auf dem Schlauch. Ich habe ein Access DB und möchte eine große Tabellen aus den Daten machen.
Die untenstehenden Tabellesituation ist vereinfacht dargestellt, sollte aber das Problem treffen,

Kunde & Adresse stehen in 1:n
genauso
Kunde & Telekommunikation (1:n)


Kunden:
kunden_id
name
vorname
titel
....

Adressen:
kunden_id
adress_id
strasse
plz
...

Telekommunikation:
kunden_id
kommunikations_id
kommunikationskennung (Emailadresse, Telnr., Faxnr.)
kommunkikations_typ (gibt an, ob Email,Telefon,Fax)
...

Wie kann ich daraus eine Tabelle machen, die so aussieht?

Mastertabelle:
kunden_id
strasse1
plz1
...
strasse2
plz2
...
kommunikationskennung (Emailadresse, Telnr., Faxnr.)
kommunkikations_typ (gibt an, ob Email,Telefon,Fax)
...
kommunikationskennung2
kommunkikations_typ2
...

Wieviele Adressen oder Kommunikationseinträge hatte ist natürlich nicht fix. Ich möchte die Adressen und die Kommmunikaionseinträge auf sagen wir 6 beschränken und möchte, dass bei einem fehlenden Adresse ein NULL eingetragen wird.
Wie kann ich das hinbekommen? Mit Accessabfragen oder direktem SQL ist egal.

Kann auch unschön aussehen und ineffizient sein. soll halt nur mal gehen, um Daten einmalig zu exportieren.

Kann mir jemand zumindest einen Anstoss geben?

Vielen Dank
philo

nicht zwingend, wäre aber schön, wenn sogar zB "kommunkikations_typ" aus der ensprechenden Schlüssentabelle eingetragen würde:

kommunkikations_typ_KEYS:
1 Email
2 Fax
3 Tel
 

FUNKayaker

Kaiser Wilhelm
Registriert
05.05.05
Beiträge
176
Hmm, ehrlich gesagt glaube ich nicht, das sich das Problem mit einer Abfrage lösen lässt. Da müsste man wohl eher ein VB-Script basteln, was die Daten durcharbeitet und z.B. in eine Excel-Tabelle schreibt...

Das wäre jetzt zumindest mein Lösungsansatz...
 

Maluku

Finkenwerder Herbstprinz
Registriert
10.05.08
Beiträge
464
Das geht mit subselects, allerdings werden die ab einer gewissen menge recht unperformant.

SELECT kunde,
(SELECT strasse from adressen where adressen.kunde = kunden.kunde LIMIT 1), (SELECT plz from adressen where adressen.kunde = kunden.kunde LIMIT 1), ...,
(SELECT strasse from adressen where adressen.kunde = kunden.kunde LIMIT 1,1), (SELECT plz from adressen where adressen.kunde = kunden.kunde LIMIT 1,1), ...,
....
from kunden;

Ich würde aber dringend empfehlen das mit einem Skript oder Stored Procedure zu lösen.
 

philo

Roter Stettiner
Registriert
13.10.04
Beiträge
973
Das geht mit subselects, allerdings werden die ab einer gewissen menge recht unperformant.

SELECT kunde,
(SELECT strasse from adressen where adressen.kunde = kunden.kunde LIMIT 1), (SELECT plz from adressen where adressen.kunde = kunden.kunde LIMIT 1), ...,
(SELECT strasse from adressen where adressen.kunde = kunden.kunde LIMIT 1,1), (SELECT plz from adressen where adressen.kunde = kunden.kunde LIMIT 1,1), ...,
....
from kunden;

Ich würde aber dringend empfehlen das mit einem Skript oder Stored Procedure zu lösen.

ok. vielen dank an alle. ich probiere es morgen mal aus.
 

philo

Roter Stettiner
Registriert
13.10.04
Beiträge
973
SELECT kunde,
(SELECT strasse from adressen where adressen.kunde = kunden.kunde LIMIT 1), (SELECT plz from adressen where adressen.kunde = kunden.kunde LIMIT 1), ...,
(SELECT strasse from adressen where adressen.kunde = kunden.kunde LIMIT 1,1), (SELECT plz from adressen where adressen.kunde = kunden.kunde LIMIT 1,1), ...,
....
from kunden;

Hab das jetzt versucht. Das LIMITerzeugt einen Syntax Fehler und ohne bekomme ich den Fehler:

Höchstens ein Datensatz kann von dieser Unterabfrage zurückgegeben werden. (Fehler 3354)

Kann es sein, dass ich mit dem Befehl oben nur einen DS bekommen kann? Ich wollte gern alle haben, da es zum Export ist (ich gebe zu, dass das versteckt im Betreff stand)

Noch eine Idee?

Gruss
philo
 

Maluku

Finkenwerder Herbstprinz
Registriert
10.05.08
Beiträge
464
Also mein Beispiel war aus MySQL erfahrung gewonnen, welche Datenbank ist das denn?

Sonst mal in der Dokumentation schauen wie man Abfragen begrenzt (bei Mysql geht das mit LIMIT)
 

FUNKayaker

Kaiser Wilhelm
Registriert
05.05.05
Beiträge
176
kein Limit in Access

Auch wenn es schon eine weile her ist...

Ich stand die Tage vor einem ähnlichen Problem, bei mir ist aber eine Oracle DB die Grundlage.

Für Access gilt leider
Microsoft Access SQL unterstützt die folgenden ANSI SQL-Features nicht:

DISTINCT-Aggregatfunktionsverweise. In Microsoft Access SQL ist z. B. SUM(DISTINCT Spaltenname) nicht zulässig.
Die Verwendung der LIMIT TO nn ROWS-Klausel, um die Anzahl der von einer Abfrage zurückgegebenen Zeilen zu begrenzen. Der Bereich einer Abfrage kann nur mit der WHERE-Klausel begrenzt werden.

Bei Oracle kann man statt LIMIT (gibt es da auch nicht) auf rownum zurückgreifen:
SELECT * FROM table WHERE rownum = 1
oder
SELECT * FROM table HAVING rownum BETWEEN 20 AND 100

Ob es bei Access auch so eine Hintertüre gibt habe ich aber noch nicht raus gefunden.