Meerdere databases in Access samenvoegen/koppelen

Status
Niet open voor verdere reacties.

richterr

Gebruiker
Lid geworden
2 dec 2008
Berichten
5
Hallo,

op mijn werk heb ik de taak gekregen om meerdere Access-databases met elkaar te verbinden. De tabellen die in alle databases staan, hebben dezelfde naam, en elke tabel heeft ook dezelfde veldnamen (met natuurlijk een andere inhoud).

Hoe ik tot nu toe de tabellen van verschillende databases gekoppeld heb, is om de tabellen eerst in 1 database te plaatsen (externe gegevens ophalen>tabellen koppelen), en ze daarna samen te voegen (SELECT * FROM database1 UNION ALL SELECT * FROM database2). Dit gaat goed, maar dit is wel een omslachtige methode, aangezien er veel databases zijn.

Ik vroeg me dus af of ik tabellen ook kan koppelen (in SQL) terwijl ze nog in verschillende databases staan (dus zoiets als FROM C:\documenten\database1\tabel1...).

Alvast bedankt voor het meedenken!

Groeten, richterr
 
Bijna goed!

Code:
select * from Table1 in 'c:\temp\databas1.mdb'
union all
select * from Table1 in 'c:\temp\databas2.mdb'
union all ...

Ik denk wel dat het resultaat niet erg snel is. Wellicht kan je er een Insert/Append query van maken die alles in 1 tabel propt? Daarna worden je queries een stuk sneller.

Enjoy!
 
Bedankt Guus,

dan nog een vervolgvraagje; ik kan nergens vinden hoe je op een makkelijke manier meer dan 2 tabellen bij elkaar voegt.
Ik begin met het aanmaken van een newtable, en dan

insert into newtable in 'c:\temp\databas1.mdb'
select * from table 1 in 'c:\temp\databas1.mdb';

Hoe ga ik vervolgens verder om nog meer tabellen aan newtable toe te voegen? Kan dat in dezelfde query of moet ik een query per tabel schrijven en die dan in een macro ofzo laten draaien?

Alvast bedankt!
richterr
 
Code:
INSERT INTO newtable IN 'c:\temp\db1.mdb'
SELECT X.* FROM
(SELECT * FROM Table1 IN 'c:\temp\db2.mdb'
UNION ALL
SELECT * FROM Table1 IN 'c:\temp\db3.mdb') X

Op deze manier kan je nog veel meer tabellen koppelen en allemaal in dezelfde query.
Ik zou echter niet * gebruiken maar ik zou alle velden noemen. Dan weet je zeker dat Veld1 niet in Veld2 terecht komt.

Enjoy!
 
Sorry, ik heb nog wat hulp nodig, het lukt me nog niet. Ik snap niet wat je X-en voorstellen. Even concreet: stel dat ik Naam1, Naam2 en Naam3 in mijn tabellen heb staan. Wat ik nu gedaan heb is het volgende. Eerst een lege newtable gemaakt met alle veldnamen er in. Vervolgens:

INSERT INTO newtable in 'c:\temp\db1.mdb'

SELECT Naam1, Naam2, Naam3 FROM
(SELECT Naam1, Naam2, Naam3 FROM Table 1 IN 'c:\temp\db2.mdb'
UNION ALL
SELECT Naam1, Naam2, Naam3 FROM Table 1 IN 'c:\temp\db3.mdb'
UNION ALL
SELECT Naam1, Naam2, Naam3 FROM Table 1 IN 'c:\temp\db4.mdb') 'c:\temp\db1.mdb';

Met als gevolg een foutmelding: "De alias Naam1 in de lijst SELECT van de querydefinitie veroorzaakt een kringverwijzing". Vetgedrukte velden zullen wel fout zijn, maar hoe??
Hopelijk lukt het nu met je hulp, bedankt alvast!

richterr
 
Als je niet weet wat die X betekent wil nog niet zeggen dat je die maar weg moet laten.
Dit is een select statement:
Code:
SELECT naam1, naam2, naam3 FROM Table1 IN 'c:\temp\db2.mdb'
UNION ALL
SELECT naam1, naam2, naam3 FROM Table1 IN 'c:\temp\db3.mdb'
Hier zette ik een alias omheen want anders werkt het niet. Bovenstaande union query wordt door die alias weer een enkele query.
Code:
SELECT X.veld1, X.veld2, X.veld3 FROM
(SELECT naam1, naam2, naam3 FROM Table1 IN 'c:\temp\db2.mdb'
UNION ALL
SELECT naam1, naam2, naam3 FROM Table1 IN 'c:\temp\db3.mdb') X
De tabelnaam in die alias is X. Er staat nu dus eigenlijk
Code:
SELECT X.veld1, X.veld2, X.veld3 FROM X
Die wordt doorgegeven aan je insert statement:
Code:
INSERT INTO newtable (veld1, veld2, veld3) IN 'c:\temp\db1.mdb'
SELECT X.veld1, X.veld2, X.veld3 FROM
(SELECT naam1, naam2, naam3 FROM Table1 IN 'c:\temp\db2.mdb'
UNION ALL
SELECT naam1, naam2, naam3 FROM Table1 IN 'c:\temp\db3.mdb') X
Share & Enjoy!
 
Ah, dank je Guus! Het werkt nu.

Ik dacht dat ik voor de X-en zelf iets anders in moest vullen, vandaar...
 
sql-code gebruiken om query te loopen

Als vervolg op de vorige vraag heb ik nog een vraag met enige wijzigingen:

Ik wil één grote database maken van verschillende externe databases. Ik ga als volgt te werk:
1. Ik creeer een tabel met daarin alle veldnamen die ik wil gebruiken

CREATE TABLE tabeltotaal (veld 1 integer, veld 2 varchar(255));

2. Ik voeg data toe aan de nieuwe tabel, die van verschillende tabellen uit externe databases afkomstig is

INSERT INTO tabeltotaal (veld 1, veld 2)
SELECT veld 1, veld 2 FROM (tabel 1 INNER JOIN tabel 2 ON tabel1.veld1 = tabel2.veld2);

Probleem is nu dat ik veel (40) verschillende databases heb, en die 2e stap dus zou willen automatiseren. Hoe, daar ben ik nog niet uit. De tabellen bínnen de verschillende databases zijn allemaal precies hetzelfde opgebouwd met dezelfde namen en dezelfde veldnamen binnen de tabellen.

Zou ik een loop kunnen inbouwen in SQL en zo ja, enig idee hoe ik dat moet aanpakken? Mijn gedachte is om een lijst te maken met database-map-namen, en dan daar doorheen te loopen om informatie uit de goede database te halen (for i=1:length(lijstje) enz. in Matlab...), maar mijn SQL-kennis is helaas te beperkt om het op te zetten.

Alvast bedankt voor het duwtje in de goede richting!
 
Laatst bewerkt:
Start even een nieuwe vraag. Dan krijg je sneller response!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan