14

MicrosoftAccess2007でクエリUPDATEの結果を含むテーブルのフィールドを表示するにはどうすればよいですか。SELECT

クエリの選択は次のとおりです。

SELECT Min(TAX.Tax_Code) AS MinOfTax_Code
FROM TAX, FUNCTIONS

WHERE (((FUNCTIONS.Func_Pure)<=[Tax_ToPrice]) AND ((FUNCTIONS.Func_Year)=[Tax_Year]))

GROUP BY FUNCTIONS.Func_ID;

そして、これが更新クエリです。

UPDATE FUNCTIONS

 SET FUNCTIONS.Func_TaxRef = [Result of Select query]
4

6 に答える 6

20

Access は UPDATE クエリで集計を実行できないようです。ただし、SELECT クエリで集計を実行できます。したがって、次のような定義でクエリを作成します。

SELECT func_id, min(tax_code) as MinOfTax_Code
FROM Functions
INNER JOIN Tax 
ON (Functions.Func_Year = Tax.Tax_Year) 
AND (Functions.Func_Pure <= Tax.Tax_ToPrice) 
GROUP BY Func_Id

そして、それを YourQuery として保存します。ここで、別のアクセス制限を回避する必要があります。UPDATE クエリはクエリを操作できませんが、複数のテーブルを操作できます。それでは、テーブル作成クエリを使用して、クエリをテーブルに変換しましょう。

SELECT YourQuery.* 
INTO MinOfTax_Code
FROM YourQuery

これにより、ビューのコンテンツが MinOfTax_Code というテーブルに格納されます。これで、UPDATE クエリを実行できます。

UPDATE MinOfTax_Code 
INNER JOIN Functions ON MinOfTax_Code.func_id = Functions.Func_ID 
SET Functions.Func_TaxRef = [MinOfTax_Code].[MinOfTax_Code]

Access で SQL を実行するのは少し無理が​​あります。あなたのプロジェクトで Sql Server Express Edition を検討したいと思います。

于 2009-05-16T10:16:37.293 に答える
7

以前、Access/JET SQLの相関サブクエリのいくつかの制限について書き、SQL UPDATE で複数のテーブルを結合するための構文に注目しました。その情報といくつかの簡単なテストに基づいて、単一の SQL UPDATE ステートメントで Access/JET を使用してやりたいことを行う方法はないと思います。可能であれば、ステートメントは次のようになります。

UPDATE FUNCTIONS A
INNER JOIN (
  SELECT AA.Func_ID, Min(BB.Tax_Code) AS MinOfTax_Code
  FROM TAX BB, FUNCTIONS AA
  WHERE AA.Func_Pure<=BB.Tax_ToPrice AND AA.Func_Year= BB.Tax_Year
  GROUP BY AA.Func_ID
) B 
ON B.Func_ID = A.Func_ID
SET A.Func_TaxRef = B.MinOfTax_Code

別の方法として、Access/JET では、サブクエリを別のクエリとして保存し、それをより伝統的な方法で UPDATE ステートメントに結合することができる場合があります。したがって、たとえば、上記の SELECT サブクエリを FUNCTIONS_TAX という名前の別のクエリとして保存した場合、UPDATE ステートメントは次のようになります。

UPDATE FUNCTIONS
INNER JOIN FUNCTIONS_TAX
ON FUNCTIONS.Func_ID = FUNCTIONS_TAX.Func_ID
SET FUNCTIONS.Func_TaxRef = FUNCTIONS_TAX.MinOfTax_Code

ただし、これはまだ機能しません。

これを機能させる唯一の方法は、最小の Tax_Code 値の選択と集計を帯域外に移動することだと思います。これは、VBA 関数を使用して行うことも、Access DLookup 関数を使用してより簡単に行うこともできます。上記の GROUP BY サブクエリを FUNCTIONS_TAX という名前の別のクエリに保存し、UPDATE ステートメントを次のように書き直します。

UPDATE FUNCTIONS
SET Func_TaxRef = DLookup(
  "MinOfTax_Code", 
  "FUNCTIONS_TAX", 
  "Func_ID = '" & Func_ID & "'"
)

DLookup 関数は、このクエリが Access の外部 (JET OLEDB 経由など) で使用されるのを防ぐことに注意してください。また、サブクエリが FUNCTIONS 行ごとに実行されるため、このアプローチのパフォーマンスは、対象とする行の数によってはかなりひどいものになる可能性があります (もちろん、相関関係がなくなったためです。これが順序の全体的なポイントです)。それが機能するために)。

幸運を!

于 2009-05-16T09:46:16.913 に答える
1

同様の問題がありました。ある列で文字列を検索し、その値を同じテーブルの別の列に入れたいと思っていました。以下の select ステートメントは、括弧内のテキストを検索します。

Access でクエリを作成したときに、すべてのフィールドを選択しました。そのクエリの SQL ビューで、かっこ内の値を取得したいフィールドの mytable.myfield を置き換えました。

SELECT Left(Right(OtherField,Len(OtherField)-InStr((OtherField),"(")), 
            Len(Right(OtherField,Len(OtherField)-InStr((OtherField),"(")))-1) 

テーブル作成クエリを実行しました。テーブル作成クエリには、上記の置換を含むすべてのフィールドがあり、次で終わりますINTO NameofNewTable FROM mytable

于 2011-07-29T21:08:09.523 に答える
0

これは機能しますか?テストされていませんが、要点を理解する必要があります。

UPDATE FUNCTIONS
SET Func_TaxRef = 
(
  SELECT Min(TAX.Tax_Code) AS MinOfTax_Code
  FROM TAX, FUNCTIONS F1
  WHERE F1.Func_Pure <= [Tax_ToPrice]
    AND F1.Func_Year=[Tax_Year]
    AND F1.Func_ID = FUNCTIONS.Func_ID
  GROUP BY F1.Func_ID;
)

基本的に、FUNCTIONS の各行に対して、サブクエリは最小の現在の税コードを決定し、FUNCTIONS.Func_TaxRef をその値に設定します。これは、FUNCTIONS.Func_ID がプライマリ キーまたは一意キーであることを前提としています。

于 2009-05-16T07:50:32.777 に答える
0

このトピックが古いことはわかっていますが、何か追加できると思いました。

MS Access 2010 で SQL を使用して Update with Select クエリを機能させることができませんでした。これを機能させるために、Tomalak の提案を使用しました。私はスクリーンショットを持っていましたが、どうやらこのサイトの新人すぎて投稿できませんでした。

クエリ デザイン ツールを使用してこれを行うことはできましたが、成功したことを確認した更新クエリを見ても、Access はそれを実現した SQL を表示できませんでした。そのため、SQL コードだけではこれを機能させることができませんでした。

選択クエリを別のクエリとして作成して保存しました。クエリ デザイン ツールで、保存した選択クエリを更新しようとしているテーブルを追加しました (選択クエリに一意のキーを入れたので、それらの間にリンクがありました)。Tomalak が示唆したように、Query Type を Update に変更しました。次に、更新しようとしていたフィールドを選択 (およびテーブルを指定) するだけでした。「更新先」フィールドに、取り込んだ選択クエリのフィールドの名前を入力しました。

このフォーマットは成功し、元のテーブルが更新されました。

于 2014-03-17T17:13:19.660 に答える
0

VBA関数を利用する回答をもう1つ追加したかったのですが、1つのSQLステートメントで仕事を完了できます。ただし、遅くなる可能性があります。

UPDATE FUNCTIONS
SET FUNCTIONS.Func_TaxRef = DLookUp("MinOfTax_Code", "SELECT
FUNCTIONS.Func_ID,Min(TAX.Tax_Code) AS MinOfTax_Code
FROM TAX, FUNCTIONS
WHERE (((FUNCTIONS.Func_Pure)<=[Tax_ToPrice]) AND ((FUNCTIONS.Func_Year)=[Tax_Year]))
GROUP BY FUNCTIONS.Func_ID;", "FUNCTIONS.Func_ID=" & Func_ID)
于 2013-07-03T22:16:21.297 に答える