2014-09-01 11 views
3

我使用ADO從關閉的Excel二進制文件中檢索數據。
我在該文件中有2個表格,我想要的是從Sheet1中檢索所有數據,其中ID存在於Sheet2中。
,我能做到這通過做:爲ADO構建正確的SQL字符串以獲取MAX數據日期

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. 有沒有一種方法可以使用查詢來獲得我想要的結果?

任何幫助表示讚賞。

澄清:子查詢如果我使用SQL運行它的作品。我試圖使用ADO工作。這是我第一次在SQL字符串中執行子查詢,用於打開記錄集。所以我想也許我做錯了什麼或者做了些什麼。

回答

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 
+0

+ 1 Nicely Done :) – 2014-09-03 08:13:58

+0

奇妙的是'as CreateDate'部分看起來不起作用。 – L42 2014-09-03 08:41:26

1

我會先加入Sheet1Sheet2,然後加入一個只有最大創建日期的子查詢。事情是這樣的:

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
+1

謝謝加雷斯。這在SQL中起作用。但我想要做的是通過使用ADO的VBA執行查詢。我似乎無法使子查詢工作。 – L42 2014-09-01 09:57:18

+0

沒有probs,子查詢將與ADO一起使用。當您嘗試使用我在SQL字符串中發佈的代碼時發生了什麼? – Gareth 2014-09-01 09:59:23

+0

它說在查詢表達式'ON e.ID = u.IDINNER JOIN(SELECT ID,MAX(Cre​​ateDate)AS MaxCD FROM [Sheet1 $] GROUP BY ID)AS MCD ON e.ID中有一個語法錯誤= MCD.ID AND e.CreateDate = MCD.MaxCD'' – L42 2014-09-01 10:06:29