2014-10-27 74 views
0

我試圖在Access數據庫中管理我的應用程序的依賴關係,並且我可以使用SQL查詢的幫助來讓我返回每個組件的列表作爲單個結果。SQL查詢獲取所需的DLL的所有依賴關係

例如,假設我有一個附加列以下三個表未如下所示:

CurrentBuild  Versions   Dependencies 
============== ============== ======================================= 
Item Version Item Version Item Version Dependency DepVersion 
------ ------- ------ ------- ------ ------- ---------- ---------- 
MyExe 1.3  MyExe 1.0  MyExe 1.0  N/A   N/A 
MyDll1 1.0  MyExe 1.1  MyExe 1.1  N/A   N/A 
MyDll2 1.0  MyExe 1.2  MyExe 1.2  N/A   N/A 
MyDll3 1.1  MyExe 1.3  MyExe 1.3  N/A   N/A 
        MyExe 1.4  MyDll1 1.0  MyDll4  1.0 
        MyDll1 1.0  MyDll2 1.0  SomeMsDll 1.0 
        MyDll2 1.0  MyDll3 1.0  MyDll4  1.0 
        MyDll2 1.1  MyDll3 1.0  MyDll5  1.0 
        MyDll3 1.0  MyDll3 1.1  MyDll4  1.0 
        MyDll3 1.1  MyDll4 1.0  MyDll6  1.0 
        MyDll4 1.0  MyDll5 1.0  MyDll6  1.0 
        MyDll5 1.0  MyDll6 1.0  MyDll7  1.0 
        MyDll6 1.0  MyDll7 1.0  MyDll8  1.0 
        MyDll7 1.0 

我可以使用哪些查詢來獲取從CurrentBuild表下面的結果呢?我寧願對VBA宏進行簡單的查詢;然而,如果不能用查詢完成,我並不反對VBA宏。

Item  Version 
----------- ------- 
MyExe  1.3 
MyDll1  1.0 
MyDll2  1.0 
MyDll3  1.1 
MyDll4  1.0 
MyDll6  1.0 
MyDll7  1.0 
MyDll8  1.0 
SomeMsDll 1.0 

到目前爲止,我有以下,但這並不能給我想要的結果;它只是給我回CurrentBuild表的內容:

SELECT W.Item, W.Version 
FROM (SELECT DISTINCT V.[Item], V.[Version] 
    FROM ([Versions] AS V 
    INNER JOIN [Dependencies] AS D ON V.[Item] = D.[Dependency] AND V.[Version] = D.[DepVersion]) 
    INNER JOIN [CurrentBuild] AS S ON D.[Item] = S.[Item] AND D.[Version] = S.[Version] 

    UNION 

    SELECT DISTINCT V.[Item], V.[Item] 
    FROM [Versions] AS V 
    INNER JOIN [CurrentBuild] AS S ON V.[Item] = S.[Item] AND V.[Version] = S.[Version]) AS W; 

如果你很好奇,爲什麼MyExe沒有對MyDlls依賴關係,簡單的答案是,它並不需要回答關於這個問題我查詢;但是,僅供參考,這些DLL是動態加載的,所以MyExe對MyDll沒有構建時間依賴性。

謝謝。

+0

否決一個問題,當這將有助於提供一個評論。這個問題以什麼方式不顯示任何研究工作,是不明確的還是沒有用的?謝謝。 – jia103 2014-10-27 18:41:05

回答

0

包吸盤組成工會查詢,只要抓住每個項目的最高版本值:

SELECT Max(Item) as Item, Max(Version) as Version 
FROM 
(SELECT Item, Version 
FROM CurrentBuild 

UNION 

SELECT Item, Version 
FROM Versions 

UNION 

SELECT Item, Version 
FROM Dependencies 

UNION 

SELECT Dependency as Item, DepVersion as Version 
FROM Dependencies) AllItem 

GROUP BY Item, Version 
+0

感謝您的及時回覆,但恐怕這對我不起作用。我澄清了上面的例子,以包含我在CurrentBuild表(MyExe 1.4和MyDll2 1.1)中需要的其他版本,所以我不能只抓取最大版本。上面的內部SELECT查詢似乎工作正常,但是當我嘗試整個查詢時,出現以下錯誤:在查詢定義的SELECT列表中,由別名'Item'引起的循環引用。 – jia103 2014-10-27 18:40:08

+0

嘗試進行內部連接不會起作用,因爲某些項目沒有依賴關係,反之亦然。你最好的選擇就是獲得一個長列表,然後拿出該項目的最大版本。你可能不得不使用一些語法,但這是正確的想法。 – 2014-10-27 18:46:16