1

私はMSSQLServerで書かれた次のクエリを持っています:

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

これは完全に機能しますが、Accessで使用しようとすると、まったく機能しません。

助けてください!

わかりました。10進数としてキャストする必要はありません。floatも機能します。

私の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

Select in Accessの構文では、「from」なしでselectを記述できません。

アクセス文法:

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」を必要とするため、Accessでは無効です。

これは少し一貫性がありませんが、これは:

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 SQLがをサポートしていないため、Accessはクエリのこの部分に文句を言いますCOUNT (DISTINCT anything)

SELECT COUNT (DISTINCT PatentNo) FROM Inventor

その部分を次のように書き直すことができます。

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

ただし、完全なクエリを使用するように適合させることは、より困難になります。提供する単一のAccessクエリTotalInventors/TotalPatentsが本当に最善の方法であるかどうかを検討してください。TotalInventorsSQLコーディングタスクを2つのクエリ(1つはあなたに与えるもの、もう1つはあなたに与えるもの)に分割することで、SQLコーディングタスクを簡単にできると思いますTotalPatents。次に、クエリを呼び出すクライアントコードで除算を行います。

于 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 ;

カンマは他のDBMS,と同じように書かれます。CROSS JOIN

于 2012-10-10T22:04:46.470 に答える