[英]NESTED INNER JOIN using MS Access 2003 via 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中获取总数。
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帮助 。 另一种可能性是,别名在某种程度上受到限制,因此它们对联接不可用,但是我不是MS Access方面的专家。 也许您应该尝试完全删除别名。
您的代码有两个小问题:以下划线字符( _Equipment_id
)开头的表名和作为SQL关键字( AS count
)的AS
子句(“ alias”)。 更正这些错误后,您的SQL即为有效的SQL-92语法。
可悲的是,问题在于Access(ACE,Jet等)不支持SQL-92标准。 Access坚持将每个嵌套的JOIN
子句放在括号中。
[此外:在标准SQL中允许使用括号中的JOIN
,因为它可能会更改查询结果。 但是,Access不遵守编码器指定的顺序,而是允许自己评估JOIN
的顺序,以使其符合fir的要求。 因此,不仅Access的语法与标准不兼容,而且还会失去功能! 但是,Access的此进一步问题不会对该特定查询产生不良影响。]
您在同一范围内有两个JOIN
:
...
INNER JOIN Project t1 ON t3.Project_number=t1.Project_number
INNER JOIN
...
您的代码需要通过将JOIN
括在括号中来解决Access的问题。 因为您所有的JOIN
都具有INNER
风味,所以去哪里可能都没有关系。
此外,关于更正AS
子句,Access再次不支持Standard 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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.