Accessに「tempSpring_ASN」というテーブルがあり、次のフィールドがあります(特に)。
SHP_CUSTOM_5(オートナンバー)
RECORD_TYPE(テキスト)
PO_NUM(テキスト)。
RECORD_TYPEの値を変更する必要があります。たとえば、PO_NUMが前のレコードのPO_NUMと同じである場合、RECORD_TYPEは「LIN」である必要があります。それ以外の場合(または最初のレコードである場合)、RECORD_TYPEは「HDR」である必要があります。
RECORD_TYPEの正しい新しい値を取得するために、次のクエリを作成しました。
SELECT TOP 1 t1.SHP_CUSTOM_5,
t1.PO_NUM AS CurrentValue,
NULL AS PreviousValue,
"HDR" AS RECORD_TYPE
FROM tempSpring_ASN AS t1
ORDER BY t1.SHP_CUSTOM_5
UNION ALL
SELECT t1.SHP_CUSTOM_5,
t1.PO_NUM AS CurrentValue,
t2.PO_NUM AS PreviousValue,
IIf([CurrentValue]=[PreviousValue],'LIN','HDR') AS RECORD_TYPE
FROM tempSpring_ASN AS t1,
tempSpring_ASN AS t2
WHERE t1.SHP_CUSTOM_5 = t2.SHP_CUSTOM_5 + 1
ORDER BY t1.SHP_CUSTOM_5;
そのクエリを「tempSpring_ASN_With_PreviousRow」として保存しました。今、私はそれを使用して、次のクエリで元のtempSpring_ASNテーブルを更新しようとしています。
UPDATE tempSpring_ASN INNER JOIN tempSpring_ASN_With_PreviousRow ON tempSpring_ASN.SHP_CUSTOM_5 = tempSpring_ASN_With_PreviousRow.SHP_CUSTOM_5 SET tempSpring_ASN.RECORD_TYPE = [tempSpring_ASN_With_PreviousRow].[RECORD_TYPE];
しかし、「操作は更新可能なクエリを使用する必要があります」というメッセージが表示されます。結合内の1つのテーブルを更新しようとしているのか、同じテーブルの値に基づいてテーブルを更新しようとしているのか、それとも他の理由によるのかはわかりません。とにかく、私はうまくいくものを探しています。
ありがとう!
更新(しゃれは意図されていません):
次の更新クエリを試しました。
UPDATE tempSpring_ASN INNER JOIN Table5 ON tempSpring_ASN.SHP_CUSTOM_5 = Table5.SHP_CUSTOM_5 SET tempSpring_ASN.RECORD_TYPE = "zzz";
そしてそれはうまくいきました。その結果、tempSpring_ASNは更新されましたが、Table5は更新されませんでした。明らかに、SQLステートメントで2つのテーブルが結合されている場合、一方のテーブルで更新を実行しても、結合でもう一方のテーブルを更新しようとはしません。その場合、元の更新クエリが機能しない理由がわかりません。UNIONクエリであるため、tempSpring_ASN_With_PreviousRowは更新できないことは知っていますが、更新しようとはしていません。むしろ、tempSpring_ASN(更新可能な結合内の他のテーブル)を更新しようとしています。
更新2: 次に、次のように相関サブクエリを使用してみました。
UPDATE tempSpring_ASN AS t
SET t.RECORD_TYPE = (
SELECT RECORD_TYPE
FROM (
SELECT TOP 1 t1.SHP_CUSTOM_5,
t1.PO_NUM AS CurrentValue,
NULL AS PreviousValue,
"HDR" AS RECORD_TYPE
FROM tempSpring_ASN AS t1
ORDER BY t1.SHP_CUSTOM_5
UNION ALL
SELECT t1.SHP_CUSTOM_5,
t1.PO_NUM AS CurrentValue,
t2.PO_NUM AS PreviousValue,
IIf([CurrentValue] = [PreviousValue], 'LIN', 'HDR') AS RECORD_TYPE
FROM tempSpring_ASN AS t1,
tempSpring_ASN AS t2
WHERE t1.SHP_CUSTOM_5 = t2.SHP_CUSTOM_5 + 1
ORDER BY t1.SHP_CUSTOM_5
)
WHERE SHP_CUSTOM_5 = t.SHP_CUSTOM_5
);
しかし、「操作には更新可能なクエリを使用する必要があります」というメッセージが表示されます。
アップデート3:
このエラーは、ユニオンクエリを使用していることが原因であると考えています。問題を特定するために、次のことを試しました(希望する結果は得られませんが、問題の診断には役立ちます)。
UPDATE tempSpring_ASN AS t
SET t.RECORD_TYPE = (
SELECT TOP 1 RECORD_TYPE
FROM tempSpring_ASN_With_PreviousRow
);
それは私に同じエラーを与えました。したがって、問題は、ユニオンクエリの出力の単一の値を使用してレコードセットに値を設定できないのはなぜかということです。