我在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;
仍有语法错误
答案 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编码任务。然后在调用查询的客户端代码中进行除法。