2014-07-05 2 views
4

Je travaille actuellement sur une requête SQL pour Access 97. Les tableaux suivants (simplifiés à des fins de démonstration) figurent chacun dans des fichiers mdb distincts:Accès à une autre base de données protégée par mot de passe dans une requête SQL dans Access 97

Tableau 1 dans C: \ db \ db1.mdb:

PartyId (PK) Name 
------------ --------  
1    A 
2    B 
3    C 

Tableau2 dans C: \ db \ bd2.mdb:

PartyId (PK) Date (PK) Value 
------------ --------- ----- 
1    6/30/2014 4 
1    7/1/2014  8 
2    5/3/2014  3 
3    5/5/2014  5 
3    5/3/2014  1 
3    5/2/2014  2 

ici, je voudrais chercher la valeur la plus récente de chaque p arty, basé sur une date définie. Alors disons que, j'étiqueter 05/07/2014 comme date cible, ma requête doit retourner les éléments suivants:

PartyId Name Date  Value 
------- ---- -------- ----- 
1   A  7/1/2014 8 
2   B  5/3/2014 3 
3   C  5/5/2014 5 

J'ai créé la requête suivante dans le répertoire C: \ db \ db1.mdb base de données :

SELECT T.TPartyId, Name, T.TDate, T.TValue 
FROM Table1 INNER JOIN [ 
SELECT Table2.PartyId AS TPartyId, MAX(Table2.Date) AS TDate, FIRST(Value) AS TValue 
FROM Table2 IN 'C:\db\db2.mdb' 
WHERE Table2.Date <= #7/5/2014# 
GROUP BY Table2.PartyId]. AS T 
ON (Table1.PartyId = T.TPartyId); 

Le problème est que Tableau2 est en fait situé dans un mot de passe fichier de base de données protégée. Par conséquent, j'ai essayé de modifier la requête, comme décrit dans http://support.microsoft.com/kb/113701, à ce qui suit:

SELECT T.TPartyId, Name, T.TDate, T.TValue 
FROM Table1 INNER JOIN [ 
SELECT Table2.PartyId AS TPartyId, MAX(Table2.Date) AS TDate, FIRST(Value) AS TValue 
FROM [;database=C:\db\db2.mdb;PWD=mypwd].Table2 
WHERE Table2.Date <= #7/5/2014# 
GROUP BY Table2.PartyId]. AS T 
ON (Table1.PartyId = T.TPartyId); 

Cependant, il en résulte toujours une erreur de syntaxe. Je soupçonne que les parenthèses de suivi trouvées dans la déclaration sont la cause de l'échec. Malheureusement, Access 97 exige toujours que les alias soient placés entre crochets, suivis d'un point, alors qu'Access 2000 et les versions supérieures n'ont pas cette limitation. Y a-t-il un moyen d'accomplir cette requête avec Access 97? Merci.

+0

Je suspecte un vieil insecte. Il y a longtemps que j'ai utilisé '97, mais avez-vous essayé d'éditer en vue SQL et de remplacer 'INNER JOIN [...]' par 'INNER JOIN (...)' Cela fonctionnait en 2000, mais dès que possible lorsque vous ouvrez en mode Création, la requête est à nouveau interrompue. – Fionnuala

+0

@Remou Oui, j'ai observé ce comportement avec Access 2000 aussi bien. Malheureusement, Access 97 ne supporte pas la syntaxe 'INNER JOIN (...)' et le classe comme une erreur de syntaxe. Par conséquent, je suis obligé d'utiliser la syntaxe 'INNER JOIN [...]'. – Aurora

+0

Juste deviner .., avez-vous essayé (...) dans le code, plutôt que la fenêtre de conception de la requête? – Fionnuala

Répondre

4

Enfin, après d'innombrables sessions d'erreur d'essai &, j'ai trouvé une solution. Cette ligne semble travail et évite également de placer deux crochets d'ouverture après l'autre:

FROM Table2 IN '' ';database=C:\db\db2.mdb;PWD=mypwd' 

Il est dommage que cela ne soit pas documenté quelque part d'une manière appropriée.

-1
Create Qry1 ="SELECT Table2.PartyId AS TPartyId, 
    MAX(Table2.Date) AS TDate, FIRST(Value) AS TValue 
FROM [;database=C:\db\db2.mdb;PWD=mypwd].Table2 
WHERE Table2.Date <= #7/5/2014# 
GROUP BY Table2.PartyId " 

SELECT T.TPartyId, Name, T.TDate, T.TValue 
FROM Table1 INNER JOIN Qry1 
ON (Table1.PartyId = Qry1.TPartyId); 
Questions connexes