Pada beberapa query Microsoft Access, saya mendapatkan pesan berikut: Operasi harus menggunakan kueri yang dapat diperbarui. (Kesalahan 3073). Saya menyiasatinya dengan menggunakan tabel sementara, tetapi saya bertanya-tanya apakah ada cara yang lebih baik. Semua tabel yang terlibat memiliki kunci utama. Ini kodenya:
UPDATE CLOG SET CLOG.NEXTDUE = (
SELECT H1.paidthru
FROM CTRHIST as H1
WHERE H1.ACCT = clog.ACCT AND
H1.SEQNO = (
SELECT MAX(SEQNO)
FROM CTRHIST
WHERE CTRHIST.ACCT = Clog.ACCT AND
CTRHIST.AMTPAID > 0 AND
CTRHIST.DATEPAID < CLOG.UPDATED_ON
)
)
WHERE CLOG.NEXTDUE IS NULL;
Sejak Jet 4, semua kueri yang memiliki gabungan ke pernyataan SQL yang merangkum data tidak akan dapat di-update. Anda tidak menggunakan JOIN, tetapi klausa WHERE persis sama dengan join, dan dengan demikian, pengoptimal kueri Jet memperlakukannya dengan cara yang sama seperti memperlakukan join.
Saya khawatir Anda tidak beruntung tanpa tabel temp, meskipun mungkin seseorang dengan pengetahuan Jet SQL yang lebih baik daripada saya dapat menemukan solusi.
BTW, mungkin saja tabel tersebut dapat diupdate di Jet 3.5 (Access 97), karena banyak sekali query yang dapat diupdate yang kemudian menjadi tidak dapat diupdate ketika diupgrade ke Jet 4.
--
Masalahnya jelas berhubungan dengan penggunaan (dalam hal ini) fungsi max(). Fungsi agregasi apa pun yang digunakan selama penggabungan (misalnya untuk mengambil nilai max atau min atau avg dari tabel yang digabungkan) akan menyebabkan kesalahan. Dan hal yang sama berlaku untuk menggunakan subkueri sebagai pengganti gabungan (seperti dalam kode asli).
Ini sangat menjengkelkan (dan tidak dapat dibenarkan!) karena ini adalah hal yang cukup umum untuk dilakukan. Saya juga harus menggunakan tabel temp untuk mengatasinya (tarik nilai agregat ke dalam tabel temp dengan pernyataan sisipan, lalu gabung ke tabel ini dengan pembaruan Anda, lalu hapus tabel temp).
Glenn
Intinya, meskipun SQL Anda terlihat sangat masuk akal, Jet tidak pernah mendukung sintaks standar SQL untuk UPDATE
. Sebaliknya, Jet menggunakan sintaksis miliknya sendiri (berbeda lagi dari sintaksis UPDATE
milik SQL Server) yang sangat terbatas. Seringkali, satu-satunya solusi " Operasi harus menggunakan kueri yang dapat diperbarui &" sangat menyakitkan. Pertimbangkan dengan serius untuk beralih ke produk SQL yang lebih mumpuni.
Untuk beberapa detail lebih lanjut tentang masalah spesifik Anda dan beberapa kemungkinan solusi, lihat Update Query Based on Totals Query Fails.