일부 Microsoft Access 쿼리에서 다음 메시지가 표시됩니다: 작업은 업데이트 가능한 쿼리를 사용해야 합니다. (오류 3073). 임시 테이블을 사용하여 문제를 해결했지만 더 좋은 방법이 있는지 궁금합니다. 관련된 모든 테이블에는 기본 키가 있습니다. 다음은 코드입니다:
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;
Jet 4부터 데이터를 요약하는 SQL 문에 대한 조인이 있는 모든 쿼리는 업데이트할 수 없습니다. JOIN을 사용하지는 않지만 WHERE 절은 조인과 정확히 동일하므로 Jet 쿼리 옵티마이저는 조인과 동일한 방식으로 처리합니다.
임시 테이블이 없다면 운이 없겠지만, 저보다 Jet SQL에 대해 더 잘 아는 사람이 해결 방법을 찾을 수 있을지도 모르겠습니다.
참고로 Jet 3.5(Access 97)에서는 업데이트가 가능했던 많은 쿼리가 Jet 4로 업그레이드하면서 업데이트가 불가능해졌기 때문일 수 있습니다.
--
나는 유사한 문제는 다음과 같은 쿼리지 않을 것't work;
update tbl_Lot_Valuation_Details as LVD
set LVD.LGAName = (select LGA.LGA_NAME from tbl_Prop_LGA as LGA where LGA.LGA_CODE = LVD.LGCode)
where LVD.LGAName is null;
update tbl_LOT_VALUATION_DETAILS inner join tbl_prop_LGA on tbl_LOT_VALUATION_DETAILS.LGCode = tbl_prop_LGA.LGA_CODE
set tbl_LOT_VALUATION_DETAILS.LGAName = [tbl_Prop_LGA].[LGA_NAME]
where tbl_LOT_VALUATION_DETAILS.LGAName is null;
그러나 사용하여 DLookup 문제를 해결;
update tbl_Lot_Valuation_Details as LVD
set LVD.LGAName = dlookup("LGA_NAME", "tbl_Prop_LGA", "LGA_CODE="+LVD.LGCode)
where LVD.LGAName is null;
이 솔루션을 원래는 제안서https://stackoverflow.com/questions/537161/sql-update-woes-in-ms-access-operation-must-use-an-updateable-query
이 문제는 분명히 max() 함수의 사용과 관련이 있습니다(이 경우). 조인 중에 사용되는 모든 집계 함수(예: 조인된 테이블에서 최대값 또는 최소값 또는 평균값을 검색하는 데 사용)는 오류를 유발합니다. 조인 대신 하위 쿼리를 사용하는 경우에도 마찬가지입니다(원래 코드에서와 같이).
이는 매우 성가신(그리고 정당화되지 않는!) 일이지만, 상당히 일반적인 일입니다. 또한 이 문제를 해결하기 위해 임시 테이블을 사용해야 했습니다(삽입 문을 사용하여 집계된 값을 임시 테이블로 가져온 다음 업데이트를 통해 이 테이블에 조인한 다음 임시 테이블을 삭제).
Glenn
에 오류가 없습니다. 그러나 오류가 발생하기 때문에 다음과 같은 이유가 있습니다.
- Please check weather you have given Read-write permission to MS-Access database file.
- The Database file where it is stored (say in Folder1) is read-only..?
당신은 저장된 데이터베이스(MS-스 파일)를 읽기 전용 폴더,응용 프로그램을 실행하는 동안 연결이지 않는 힘이 완전히 열립니다. 따라서 파일이 변경 권한/포함하는 폴더의 권한에서처럼C:\Program 파일의
모두 대부분의 모든 c 드라이브는 파일을 설정되읽기 전용이렇게 변화하는 이 권한이 이 문제를 해결합니다.
이 있을 때 발생하지 않은 독특한 MS-에 대한 액세스 키 테이블(s)업데이트되고 있습니다. (에 관계없이 SQL 스키마).
을 만들 때 MS 액세스 링크를 SQL 테이블을 지정하는 인덱스(key)에서 링크를 시간이다. 이것이 잘못거나,쿼리에 대하여 연결된 테이블을 업데이트할 수 없
에 연결할 때 SQL 이블로 액세스하는지 확인에 액세스할 때 묻는 인덱스(key)를 사용하여 정확하게 어떤 SQL 을 사용하여 문제를 방지하기 위해(s)지만,지정 독특한 모든 키는 모두 접근 업데이트해야 합니다.
되지 않은 경우는 사람은 원래된 테이블,삭제된 테이블에서 MS-ACCESS(링크만이 삭제되)과 다시 연결을 지정하는 키가 제대로 모든 것이 제대로 작동합니다.
내가 하려고 구축 업데이트 쿼리에 액세스합니다. 나 업데이트 쿼리를 내가 쓴 나 자신이 좋아하는
UPDATE TABLE1
SET Field1 =
(SELECT Table2.Field2
FROM Table2
WHERE Table2.UniqueIDColumn = Table1.UniqueIDColumn)
쿼리에게는 오류를'다시보는 것입니다. 이 일에 나의 SQL 서버지만,그럼 이전 답변,지적 접근 업데이트 구문지't 준 다는 것이다. 그러나 제가 다시 사용하여 액세스's 쿼리 마법사(이용 JOIN)에 있습니다. 일반적으로 I'd 그들에게 업데이트 쿼리 패스스루를 사용하여 비 제트 구문을하지만,하나의 테이블 나와 함께 참여하였다 지역 액세스 테이블.
답을 주는 위해 iDevlop 나를 위해 일했습니다. 참고로 나는 아니었't 을 찾을 수 있 RecordsetType 는 시설 내에서 업데이트 쿼리가 있습니다. 그러나,나를 찾을 수 있는 속성을 변경하여 쿼리를 선택 쿼리,설정하는 시설로 iDevlop 주목하고 그 변경 내 쿼리를 업데이트 쿼리가 있습니다. 이 일을 아무에 필요한 임시이다.
나는'd 좋아에 대한 이해의견은 무엇 iDevlop 게시도록에서 흘러 그의 솔루션이지만,I don't 충분히 높은 점수입니다.
본질적으로, 귀하의 SQL은 완벽하게 합리적으로 보이지만, Jet는 '업데이트'에 대한 SQL 표준 구문을 지원하지 않습니다. 대신, 매우 제한적인 자체 독점 구문(SQL Server의 독점적인 UPDATE
구문과는 또 다른)을 사용합니다. 종종 유일한 해결 방법 인 "작업은 업데이트 가능한 쿼리를 사용해야합니다."는 매우 고통 스럽습니다. 더 성능이 뛰어난 SQL 제품으로 전환하는 것을 진지하게 고려하세요.
특정 문제와 가능한 해결 방법에 대한 자세한 내용은 총계 쿼리 실패에 따른 업데이트 쿼리를 참조하세요.
오늘에서 내 MS-Access2003ODBC 테이블을 가리키는 SQL Server2000sa 암호를 나 같은 오류가 있습니다. 저는 정의된 기본 키의 테이블에서 SQL 서버 데이터베이스에 문제가 사라졌습니다.
당신은 항상 코드를 작성에 VBA 업데이트하는 마찬가지로. 나는 이 문제는 너무,그리고 나의 대안을 만들기 선택 쿼리와 모두 결합하고,모든 데이터한 업데이트할 수 있도록 만들기,레코드 집합을하고 업데이트를 실행 쿼리를 반복적으로 업데이트 쿼리만을 업데이트,테이블만 검색 기준을'재고
Dim updatingItems As Recordset
Dim clientName As String
Dim tableID As String
Set updatingItems = CurrentDb.OpenRecordset("*insert SELECT SQL here*");", dbOpenDynaset)
Do Until updatingItems .EOF
clientName = updatingItems .Fields("strName")
tableID = updatingItems .Fields("ID")
DoCmd.RunSQL "UPDATE *ONLY TABLE TO UPDATE* SET *TABLE*.strClientName= '" & clientName & "' WHERE (((*TABLE*.ID)=" & tableID & "))"
updatingItems.MoveNext
Loop
나는'm 만 이렇게 하는 약 60 기록 일하고,그것은 몇 천는 훨씬 더 많은 시간이 걸릴하고,쿼리로 실행 시작에서 끝에 여러 번의 선택 전체 그룹을 만들기 및 변경합니다. 필요할 수 있는''위한 따옴표 tableID,그것이's 문자열을,그러나 나는'm 확 이것은 나를 위해 일했습니다.
더욱이 대답은 무엇 DRUA 에 언급된 그/그녀의 정답...
내가 개발한 데이터베이스에 액세스하 2007. 내 사용자가 사용하여 액세스를 2007 년 런타임입니다. 그들은 읽기 권한을 database_Front(프런트 엔드)폴더를 읽기/쓰기 권한을 database_Back 폴더에 있습니다.
에서 새로운 데이터베이스는 사용자에 따르지 않았고 전체 지침의 복사 프런트 엔드 그들의 컴퓨터를 대신에 만든 바로 가기입니다. 실행되는 프런트 엔드를 통해 바로 가기를 만듭 상태 쿼리를 업데이트할 수 있기 때문에 파일의 작성에 제한이 있습니다.
복사 프런트 엔드 그들의 문서 폴더의 문제를 해결합니다.
네,그것은 복잡하게 일할 때 사용자가하여 업데이트된 버전의 전면-종료,하지만 적어도 쿼리가 제대로 작동하지 않고도 리조트 온도는 테이블과 같은.