2014-10-27 101 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