为ADO构造正确的SQL字符串以获取具有MAX Date的数据

时间:2014-09-01 08:04:28

标签: vba excel-vba excel-2010 ado excel

我正在使用ADO从已关闭的Excel二进制文件中检索数据 我在该文件中有2个表格,我想要的是从 Sheet1 中检索 Sheet2 中存在ID的所有数据。
我能够做到这一点:

sqlstr = "SELECT e.NOTES, u.SPO, e.ID, e.REF, e.PID "
sqlstr = sqlstr & ", e.DESCRIPTION, e.CreateDate "
sqlstr = sqlstr & "FROM [Sheet2$] u "
sqlstr = sqlstr & "INNER JOIN [Sheet1$] e "
sqlstr = sqlstr & "ON e.ID = u.ID;"

如果特定ID在Sheet1中反映了2个或更多x但具有不同日期,则会出现问题 我需要检索具有最高数据的ID,因此我尝试以下内容:

sqlstr = "SELECT e.NOTES, u.SPO, e.ID, e.REF, e.PID  "
sqlstr = sqlstr & ", e.DESCRIPTION, e.CreateDate "
sqlstr = sqlstr & "FROM [Sheet2$] u "
sqlstr = sqlstr & "INNER JOIN (SELECT ID, REF, PID, DESCRIPTION, NOTES, MAX(CreateDate) "
sqlstr = sqlstr & "FROM [Sheet1$] GROUP BY ID, REF, PID, DESCRIPTION, NOTES) e "
sqlstr = sqlstr & "ON e.ID = u.ID;"

不幸的是,这不起作用并且给了我这个错误:

enter image description here

我尝试隔离我的子查询,如下所示:

sqlstr = "SELECT ID, REF, PID, DESCRIPTION, NOTES, MAX(CreateDate) "
sqlstr = sqlstr & "FROM [Sheet1$] GROUP BY ID, REF, PID, DESCRIPTION, NOTES;"

工作正常。它仅返回具有最大日期的所有ID 我的问题是:

  1. 当我尝试将其用作子查询时,为什么它不起作用。
  2. 从Excel文件或数据库中提取数据时,ADO是否支持子查询
  3. 有没有办法只使用查询获得我想要的结果?
  4. 感谢任何帮助。

    澄清:如果我使用SQL运行它,则子查询有效。我试图使用ADO使其工作。这是我第一次在SQL字符串中执行子查询,用于打开记录集。所以我想也许我做错了什么或做了一些超出范围的事情。

2 个答案:

答案 0 :(得分:2)

你可能做得太过分了。

试试这个:

(未经测试的代码)

SELECT e.NOTES, u.SPO, e.ID, e.REF, e.PID, e.DESCRIPTION, MAX(e.CreateDate) as CreateDate 
FROM [Sheet1$] e  
INNER JOIN [Sheet2$] u ON e.ID = u.ID 
GROUP BY e.ID, e.REF, e.PID, e.DESCRIPTION, e.NOTES, u.SPO

答案 1 :(得分:1)

我首先将Sheet1加入Sheet2,然后加入一个只有最大创建日期的子查询。像这样:

SELECT e.NOTES, u.SPO, e.ID, e.REF, e.PID, e.DESCRIPTION, e.CreateDate
FROM [Sheet2$] u

INNER JOIN [Sheet1$] e
ON e.ID = u.ID

INNER JOIN (
    SELECT ID, MAX(CreateDate) AS MaxCD
    FROM [Sheet1$]
    GROUP BY ID
) AS MCD
ON e.ID = MCD.ID
AND e.CreateDate = MCD.MaxCD

这主要是做什么:

  • 加入Sheet1
  • 的所有结果
  • 再次加入Sheet1,但只有最高创建日期。