[SQL] SQL 업데이트는 MS Access에서 비애 - 작업이 업데이트 가능한 쿼리를 사용해야합니다
SQLSQL 업데이트는 MS Access에서 비애 - 작업이 업데이트 가능한 쿼리를 사용해야합니다
나는 다른 테이블에서 검색 할 수 있도록 필드 포맷 기본적으로 텍스트 조작을 수행하는 선택 쿼리를 가지고 :
나는 "J1 / 2"와 같은 필드가 있다면 내 첫 번째 테이블은 해당 필드에 J1과 J2와 다른 테이블에서 레코드의 ID를 검색합니다.
이 모두는 잘 작동합니다.
이제 나는 더 이상이 문자열 조작을 사용하여 조회를 할 필요가 없습니다 있도록 원래의 테이블을 업데이트하고 싶지만, 업데이트 쿼리에서 내 시도는 "업데이트 가능한 쿼리를 사용해야합니다 작동"로 끝
어떤 아이디어?
내 SELECT 문 :
SELECT DISTINCT
t1.DD,
t1.TN,
t1.DD & " J" & MID(t1.TN,2,1) AS CalculatedStart,
t1.DD & " J" & MID(t1.TN,4,1) AS CalculatedEnd,
t2.ID
FROM t1 INNER JOIN t2
ON (t1.DD & " J" & MID(t1.TN,2,1)=t2.StartLink)
AND (t1.DD & " J" & MID(t1.TN,4,1)=t2.EndLink)
WHERE t1.TN Like "J?/?"
AND t1.DD Like "M*";
리콜 - 이것은 잘 작동하고 나는 다른 쪽 끝을 필요한 t2.ID를 얻을.
그래서 내가 그런 짓을 할 :
UPDATE t1 SET t2ID = (
SELECT Query1.ID
FROM Query1
WHERE t1.DD=Query1.DD
AND t1.TN=Query1.TN
)
WHERE t1.TN Like "J?/?"
AND t1.DD Like "M*";
오직이 실패합니다. 나는 문제가 될 것 같다 "업데이트 가능한 쿼리를 사용해야합니다 조작"의 가장 같은 실제 사용 권한 문제를 상상할 수 있도록 이것은 MS 액세스 자체에 있습니다.
편집 : 작동하지 않는 경우를 단순화하려고합니다.
이 업데이트 쿼리 괜찮 :
UPDATE t1
SET t2ID="Unknown"
WHERE TN LIKE "J?/?"
AND DD LIKE "M*";
이 하나가 실패 (. 감사합니다 Goedke을 - 1 개 이상이 결과 내가 과도하게 단순화 한 하위 쿼리 반환 내 문제를 찾으려고하기 때문에이 예제는 분명히 실패)
UPDATE t1
SET t2ID=(SELECT ID FROM t2)
WHERE TN LIKE "J?/?"
AND DD LIKE "M*";
그래서 난 그냥 어떤 식 으로든 내 하위 쿼리 구문 잘못이 있습니까?
편집 :이 SELECT 문은 너무 괜찮 :
SELECT t1.OA, t1.DD, t1.TN, t1.HATRIS,
query1.DD, query1.TN, query1.ID
FROM t1 INNER JOIN query1
ON t1.DD=query1.DD
AND t1.TN=query1.TN
또한, 정확히 1 개 ID는 (DD, TN)의 조합에 따라 반환되고 있다는 것을 보여준다 상기 선택 명세서에 카운트를 사용
편집하다:
내가 지금은있어 가장 간단한 경우 - T1의 기본 키와 내가 삽입 할 T1의 값 - 다양한 SELECT 문을 사용하여 나는 이제 단 2 열이있는 테이블이 있습니다.
나는 아직도 쓰기에 보일 수 없다
UPDATE t1 SET t1.f2 = (SELECT t2.f2 FROM t2 WHERE t2.f1 = t1.f1)
여기서 T1의 기본 키 F1이다. 에도 도움 WHERE t1.f1 IN (T2 FROM SELECT F1)를하지 않습니다 덧붙였다. (서브 쿼리가 0 결과를 반환 가능성을 제거하기 위해 추가)
해결법
-
==============================
1.거기 T2에서 단 하나의 레코드가없는 한 (T2 FROM SELECT ID)의 하위 쿼리가 작동하지 않을 수 있습니다. 어떤 ID를 사용해야 기다리고 있었던거야?
거기 T2에서 단 하나의 레코드가없는 한 (T2 FROM SELECT ID)의 하위 쿼리가 작동하지 않을 수 있습니다. 어떤 ID를 사용해야 기다리고 있었던거야?
당신이 조인이 있고, 예를 들어 데이터 바인딩 형태의 테이블 (다시 업데이트하는 데 필요한 기본 키, 키에 대한 원래 DISTINCT 파괴한다 정보를 모두 포함하지 않을 때 일반적으로보고되는 오류 메시지가 바인드 된 그렇다면, 발생 폼에 양식)를 다시 저장 할 수 없습니다.
당신이 DISTINCT 사용하는 사실은 서브 쿼리가 더 복잡한 예제에서 하나 개 이상의 행을 반환하는 것이 나를 의심이 만들 것입니다. 이것은 아마도 하위 쿼리 결과의 할당과 함께 가장 일반적인 문제 : 아래 - 구속 where 절을.
내부 쿼리 구문이 잘못된 경우 나 하위 쿼리 밖으로 할당으로 본 또 다른 문제입니다. SQL 2000 년과 2005 년 다시 끝이 적어도, 쿼리 프로세서가 자동으로 실패하고 이러한 경우에 반환 NULL. (이것은 지금까지의 내가, 버그를 말할 수있다 :. 나는 최고 수준에서 오류를 반환합니다 뭔가가 자동으로 하위 쿼리에서 허용 될 수없는 이유를 볼 수 없습니다 ...하지만이)
편집하다: 그냥 폴 아니면 둘 다 미친하지 않을 것을 보장하기 위해, 나는 다음과 같은 테이블을 생성 :
t1 | ID, FK, Data t2 | ID2, Data2
내가 ID2와 ID에 대한 기본 키 제약 조건을 제외한 모든 안 넣어. 모든 필드는 내가 평소 ID를 사용할 것과 다른 텍스트,했지만 관련성이 있어야합니다.
T1 :
ID FK Data Key1 Data1 Key2 Data2 Key3 Data3
T2 :
ID2 Data2 Key1 DataA Key2 DataB Key3 DataC
형태의 쿼리 :
UPDATE t1 SET t1.FK = (select ID2 from t2 where t2.ID2 = t1.ID);
같은 메시지와 함께 실패했습니다 폴 있어요.
select *, (select ID2 from t2 where t2.ID2 = t1.ID) as foreign from t1,
예상대로 작품은, 그래서 우리는 하위 쿼리 구문을 알고 비난하지 않습니다.
UPDATE t1 SET t1.FK = 'Key1'
또한 예상대로, 우리는 손상 또는 비 갱신 대상을하지 않아도 작동합니다.
참고 : 나는 SQL 2005 기본에서 데이터베이스 백엔드를 변경하는 경우, 업데이트가 작동합니다! 주위에 인터넷 검색, 내가 서브 쿼리를 대체 할을 DLookup을 제안 액세스의 MVP를 찾을 수의 비트 :
http://www.eggheadcafe.com/software/aspnet/31849054/update-with-subquerycomp.aspx
분명히 이것은 SQL Express를 2000 이상 백 엔드를 사용하는 경우 피할 액세스 SQL, 하나의 버그입니다. ( "액세스 업데이트 하위 쿼리"에 대한 구글의 결과는이 이론을 지원).
http://www.techonthenet.com/access/functions/domain/dlookup.php :이 해결 방법을 사용하는 방법은 여기를 참조하십시오
-
==============================
2.나는 OP 데이비드 W. 펜톤의 의견에 무게를해야합니다.
나는 OP 데이비드 W. 펜톤의 의견에 무게를해야합니다.
이것은 매우 제트 / ACE와 성가신 문제이다. 그러나 중 하나를 시도 :
:
UPDATE DISTINCTROW tblClient INNER JOIN qryICMSClientCMFinite ON tblClient.ClientID = qryICMSClientCMFinite.ClientID SET tblClient.ClientCMType = "F";
그래서이 해결할 수있는 문제는 거의 말도 있음이 오류 메시지와 관련된 많은 문제.
MS 액세스 한마디에있어 그 - 당신이 문제 x에 대한 무역 비밀 해결 방법을 모르는 경우, 당신은 답을 찾기 위해 노력하고 일이 걸릴 수 있습니다. 10,000 해결 방법을 알고하려면 액세스 프로그램입니다. 미숙에 대한 경고의 충분한인가?
벤
-
==============================
3.이것은 (2000 액세스) 나를 위해 일한
이것은 (2000 액세스) 나를 위해 일한
UPDATE DISTINCTROW T1 inner join T2 on T2.f1 = T1.f1 SET f2 = f2;
-
==============================
4.나는 전체 스레드를 읽어 havent't, 그러나 이것은 내가 사용하고있는 솔루션입니다 :
나는 전체 스레드를 읽어 havent't, 그러나 이것은 내가 사용하고있는 솔루션입니다 :
update (select * from t1 inner join t2 on t1.key = t2.key) set t1.field1 = t2.field2
그리고 나를 위해 MS 액세스에서 잘 작동합니다.
-
==============================
5.내 솔루션은 그런 식으로 내 SQL을 변경했다.
내 솔루션은 그런 식으로 내 SQL을 변경했다.
update (select o.pricein, g.pricein from operations o left join goods g on g.id = o.goodid where o.opertype = 4 and o.acct = 1) set o.pricein = g.pricein
-
==============================
6.내가 같은 오류가 있었다 ( "작업이 업데이트 가능한 쿼리를 사용해야합니다") 액세스 2010 사용을 나는 내부와 간단한 업데이트 쿼리를 수행하고 가입 할 수 있습니다. 모든 내가 한 내가에 가입 된 테이블에 기본 키를 추가했다 (이미 테이블에 내가 업데이트되었다 물론, 하나 있었다) 그리고 모든했다.
내가 같은 오류가 있었다 ( "작업이 업데이트 가능한 쿼리를 사용해야합니다") 액세스 2010 사용을 나는 내부와 간단한 업데이트 쿼리를 수행하고 가입 할 수 있습니다. 모든 내가 한 내가에 가입 된 테이블에 기본 키를 추가했다 (이미 테이블에 내가 업데이트되었다 물론, 하나 있었다) 그리고 모든했다.
-
==============================
7.이것의 경우 : UPDATE T1 세트 t1.f2 = (T2 WHERE t2.f1 = t1.f1 FROM t2.f2 SELECT)
이것의 경우 : UPDATE T1 세트 t1.f2 = (T2 WHERE t2.f1 = t1.f1 FROM t2.f2 SELECT)
UPDATE t1 INNER JOIN t2 ON t1.f1 = t2.f1 SET t1.f2 = [t2].[f2];
from https://stackoverflow.com/questions/537161/sql-update-woes-in-ms-access-operation-must-use-an-updateable-query by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 2 열 조합에 SQL 고유 제한 조건 (0) | 2020.06.17 |
---|---|
[SQL] 대량으로 PostgreSQL을 만 새로운 행을 삽입하는 방법 (0) | 2020.06.17 |
[SQL] 어떻게 오라클의 기존 테이블에 (또는 GET)는 DDL 스크립트를 생성 할 수 있습니까? I가이 하이브에서 그들을 다시 작성 (0) | 2020.06.17 |
[SQL] 저장하는 룩업 테이블 아이디의 순수 데이터 간의 의사 (0) | 2020.06.16 |
[SQL] MySQLi은 IN 연산자로 제표를 작성 (0) | 2020.06.16 |