2011-04-12 50 views
0

如果这个工程:嵌套INNER JOIN使用MS Access 2003中通过ODBC

SELECT COUNT(t1.ID) AS count FROM Project t1 
INNER JOIN (SELECT DISTINCT t.Site,t.id FROM _Equipment_id t WHERE t.OEM LIKE '%ABC%') t2 ON t1.Site=t2.Site AND t1.id=t2.id 

和这个作品:

SELECT COUNT(t3.ID) AS count FROM Wall t3 
INNER JOIN Project t1 ON t3.Project_number=t1.Project_number 

为什么不这项工作:

SELECT COUNT(t3.ID) AS count FROM Wall t3 
INNER JOIN Project t1 ON t3.Project_number=t1.Project_number 
INNER JOIN (SELECT DISTINCT t.Site,t.id FROM _Equipment_id t WHERE t.OEM LIKE '%ABC%') t2 ON t1.Site=t2.Site AND t1.id=t2.id 

最终,我有10个桌子,比如Wall桌子,我试图从第一个SELECT中获得总计数。......

+2

你得到什么错误? – Elliott 2011-04-12 19:50:09

+0

我的ASP页面的客户端未定义的结果,当SQL语句中存在语法错误时,这是​​相同的错误。 – shaun5 2011-04-12 19:58:58

回答

1
SELECT COUNT(t3.ID) AS count FROM Wall t3 
INNER JOIN (Project t1 
INNER JOIN (SELECT DISTINCT t.Site,t.id FROM _Equipment_id t WHERE t.OEM LIKE '%ABC%') t2 
ON t1.Site=t2.Site AND t1.id=t2.id) 
ON t3.Project_number=t1.Project_number 

也许这只是一个语法错误? Office Help在他们提到嵌套的地方。另一种可能性是别名在某种程度上被作用域,以便它们不可用于连接,但我不熟悉MS Access。也许你应该尝试完全放弃别名。

+0

这工作!如果我有10个像Wall这样的具有project_number的表,那么获取总数的最简单的SQL语句是什么? (在过去,我只是循环访问数组或表名和总数,使用每个计数) – shaun5 2011-04-12 20:51:07

+0

您可以尝试在查询底部添加'UNION',然后使用下一个Wall表重复上述相同的查询。 'UNION'应该总结所有查询的结果。如果这不能如预期的那样工作,您可能需要做COUNT(t3。ID)AS TotalCount','COUNT(t4.ID)AS TotalCount',...,'COUNT(tx.ID)AS TotalCount',这样别名在所有查询中保持不变。 – 2011-04-12 21:30:10

+0

谢谢,我希望能够拿到10个挂表,union都有一个大表,然后只添加两个内部连接,但是我无法获得这种语法。我的foreach循环工作正常,只是看起来很浪费...... – shaun5 2011-04-13 00:25:30

0

你必须与你的代码了几个小问题:即以下划线(_Equipment_id)和AS条款(“别名”)开头的表名是一个SQL关键字(AS count)。当这些被纠正时,你的SQL是有效的SQL-92语法。

不幸的是,问题在于Access(ACE,Jet等)不支持SQL-92标准。 Access坚持每个嵌套的JOIN子句放在括号内。标准SQL允许在括号内使用括号,因为它可能会改变查询结果。然而,访问,不尊重编码器指定的顺序,并允许自己评估以便看到杉木。因此,不仅Access的语法不符合标准,还有功能的丧失!然而,访问这个进一步的问题将会对这个特定的查询无不良影响]

您在同一范围内这里有两个JOIN S:

... 
INNER JOIN Project t1 ON t3.Project_number=t1.Project_number 
INNER JOIN 
... 

你的代码需要通过封闭来解决访问的问题圆括号中的JOIN;因为你所有的JOIN都是INNER的味道,所以它们去哪儿都没关系。

此外,对于纠正你的AS条款,再次访问不支持SQL标准的引用的标识符(...AS "count"...),并坚持使用其专有的方括号语法(...AS [count]...) - 当然,你可以选择一个不同的名称,但可能存在依赖它的应用程序代码。

代码要解决这两个问题的访问:

SELECT COUNT(t3.ID) AS [count] 
    FROM (Wall t3 
     INNER JOIN Project AS t1 
      ON t3.Project_number = t1.Project_number) 
     INNER JOIN (
        SELECT DISTINCT t.Site,t.id 
        FROM _Equipment_id AS t 
        WHERE t.OEM LIKE '%ABC%' 
       ) AS t2 
      ON t1.Site = t2.Site 
      AND t1.id = t2.id;