1

我有以下用 MS SQL Server 编写的查询:

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

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

请帮忙!

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

我的 Inventor 表中包含 General 表中的 PK 作为 FK。问题是,如果某件事上列出了多个发明者。所以我尝试了以下方法:

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

仍然有语法错误

4

3 回答 3

2

Access中的 Select 语法不允许您编写没有“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 ] ]

正如您在此处看到的,[ ] 表示某些内容是可选的。并且 [ ] 包装了 SQL Server 语法中的“From”,但不在访问语法中。

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

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

select    ( 1  ) /  ( 1 )

或这个

select    ( 1 )

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

select    ( select 1  ) /  ( select 1 )

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

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

这是您如何创建一个

于 2012-07-22T04:39:32.687 回答
1

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

SELECT COUNT (DISTINCT PatentNo) FROM Inventor

您可以将该部分重写为:

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

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

于 2012-07-22T13:21:43.583 回答
0

我认为这会起作用:

SELECT
    CDbl( ci ) / CDbl( cg )   AS result
FROM 
    (SELECT COUNT(*) AS ci FROM Inventor) AS i
  ,
    (SELECT COUNT(*) AS cg FROM General) AS g ;

逗号,将像CROSS JOIN在其他 DBMS 中一样编写。

于 2012-10-10T22:04:46.470 回答