获取SQL查询以在Access中工作

时间:2012-07-22 03:51:42

标签: sql sql-server ms-access

我在MS SQL Server中编写了以下查询:

select
    (select (CAST( count(*) as decimal (38,4))) from Inventor) /
    (select (CAST( count(*) as decimal(38,4))) from General);

效果很好,但是当我尝试在Access中使用它时它根本不起作用。

请帮忙!

好的,所以不必将其转换为十进制,浮点数也可以。

My Inventor表将General表中的PK作为FK。问题是如果有什么东西列在其上的多个发明者。所以我尝试了以下内容:

SELECT TotalInventors/TotalPatents
(SELECT COUNT (DISTINCT PatentNo) FROM Inventor AS TotalPatents
(SELECT COUNT (*) FROM Inventor AS TotalInventors))
FROM Inventor;

仍有语法错误

2 个答案:

答案 0 :(得分:2)

Select in Access的语法 NOT 允许您编写没有“from”的选择。

访问语法:

SELECT [predicate] { * | table.* | [table.]field1 [AS alias1] [, [table.]field2 [AS alias2] [, ...]]}
FROM tableexpression [, ...] [IN externaldatabase] --FROM is NOT optional
[WHERE... ]
[GROUP BY... ]
[HAVING... ]
[ORDER BY... ]
[WITH OWNERACCESS OPTION]

SQL Server语法:

[ WITH <common_table_expression>]
SELECT select_list [ INTO new_table ]
[ FROM table_source ] [ WHERE search_condition ] --FROM is optional
[ GROUP BY group_by_expression ]
[ HAVING search_condition ]
[ ORDER BY order_expression [ ASC | DESC ] ]

正如您所见here,[]表示某些内容是可选的。并且[]正在包装SQL Server语法的“From”,但不包含Access Grammar。

所以,基本上,您的查询在Access中无效,因为需要一个“FROM”

现在这有点不一致,而这个:

select    ( 1  ) /  ( 1 )

或者这个

select    ( 1 )

会给我一个有效的答案,这会在访问中给我一个语法错误(但它在SQL Server中有效):

select    ( select 1  ) /  ( select 1 )

您需要一个“双”表,以便您可以写:

select    (  select 1  from Dual) /  ( select 1 from Dual) from Dual.

以下是create one

的方法

答案 1 :(得分:1)

在当前版本的问题中,Access会对此部分查询抱怨,因为Access SQL不支持COUNT (DISTINCT anything)

SELECT COUNT (DISTINCT PatentNo) FROM Inventor

您可以将该片重写为:

SELECT Count(*) FROM
(SELECT DISTINCT PatentNo
FROM Inventor);

然而,调整完整查询以使用更具挑战性。考虑为您提供TotalInventors/TotalPatents的单个Access查询是否真的是最好的方法。我怀疑你可以通过将它分成2个查询(一个给你TotalInventors而另一个给你TotalPatents)来让你自己更轻松地编写SQL编码任务。然后在调用查询的客户端代码中进行除法。