web-dev-qa-db-ja.com

UPDATEクエリ内でSELECTを使用する

Microsoft Access 2007で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]
13
mammadalius

まあ、それは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を検討します。

19
Andomar

しばらく前に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行に対して実行されているため、このアプローチのパフォーマンスは、ターゲットにしている行の数に応じてかなりひどくなる可能性があります(もちろん、相関関係がないため、これが順序付けの要点です)それが機能するために)。

幸運を!

6
ewbi

同様の問題がありました。ある列で文字列を検索し、その値を同じテーブルの別の列に入れたいと思っていました。以下の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で終わります

1
Spud_Gasket

これは機能しますか?テストされていませんが、要点は理解できます。

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が主キーまたは一意キーであることを前提としています。

0
beach

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)
0
Bobort

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

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

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

選択クエリを作成し、別のクエリとして保存しました。クエリデザインツールで、保存した選択クエリを更新しようとしているテーブルを追加しました(選択クエリに一意のキーを配置して、それらの間にリンクを設定しました)。 Tomalakが示唆したように、クエリの種類を更新に変更しました。次に、更新しようとしたフィールド(およびテーブルを指定)を選択する必要がありました。 「更新先」フィールドに、持ってきた選択クエリからのフィールドの名前を入力しました。

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

0
sbaer