我目前正在为Access 97进行SQL查询。给出以下表格(为演示目的而简化),每个表都位于不同的mdb文件中:
C:\ db \ db1.mdb中的表1:
PartyId (PK) Name
------------ --------
1 A
2 B
3 C
C:\ db \ db2.mdb中的表2:
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
在这里,我想根据定义的日期查找每一方的最新价值。所以,让我们说,我将7/5/2014标记为目标日期,然后我的查询应返回以下内容:
PartyId Name Date Value
------- ---- -------- -----
1 A 7/1/2014 8
2 B 5/3/2014 3
3 C 5/5/2014 5
我在C:\ db \ db1.mdb数据库中创建了以下查询:
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);
问题是Table2实际上位于受密码保护的数据库文件中。因此,我尝试将查询(如http://support.microsoft.com/kb/113701中所述)修改为以下内容:
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);
但是,这总是会导致语法错误。我怀疑在
中找到了后续括号INNER JOIN [ … [;database= … ] … ]
声明是失败的原因。不幸的是,Access 97总是要求将别名括在方括号中,然后是句点,而Access 2000及更高版本不具有此限制。有没有什么办法可以使用Access 97完成此查询?感谢。
答案 0 :(得分:5)
最后,经过无数次的试验和错误会话,我找到了解决方案。这条线看起来很有用,也避免了两个开口的方括号:
FROM Table2 IN '' ';database=C:\db\db2.mdb;PWD=mypwd'
遗憾的是,这并没有以适当的方式记录在某处。
答案 1 :(得分:-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);