2013-02-07 4 views
0

테이블의 열을 업데이트해야합니다. 갱신 값은 다른 테이블에서 검색되어야합니다. 나는 다음과 같은 오류 얻을무관 한 두 테이블의 쿼리 업데이트

update db1.t1 set location=(select countryName from db1.t1, db2.t2 where t1.num 
between t2.beginNum AND t2.endNum limit 1) 

: 내가 만든 쿼리 문이다 나는 FROM

update db1.t1 set location=(select countryName from db2.t2 where num 
between t2.beginNum AND t2.endNum limit 1) 

에서 테이블 이름 t1을 제거 할 때 다음

Error Code: 1093 You can't specify target table t1 for update in FROM clause. 

을, 쿼리 일 하지만 제대로 작동하는지 확실하지 않습니다. 내가 아는 한, 두 개 이상의 테이블에서 검색하는 경우 두 테이블을 FROM 절에 지정해야합니다. 내가 작업하는 두 개의 테이블에는 일반적인 열이 없습니다. 그러나 t2의 두 값 사이에서 찾을 수있는 값은 t1입니다. 두 번째 쿼리가 절대적으로 올바른 것입니까? 이 쿼리가 where 절 뒤에있는 num 절이 첫 번째 테이블에 있다는 것을 어떻게 알 수 있습니까? 나는 잘못된 값을 얻는 것이 두렵다.

+0

데이터를 100 % 확실하게 확인할 수없는 경우 SQLFiddle.com으로 이동하여 동일한 테스트를 수행하여 쿼리가 작동하는지 확인하십시오. – jcho360

+0

이후에 변경된 행의 양 쿼리를 실행 했습니까? 그것은 당신이 실제로 업데이 트하는 테이블에 대한 조건을 설정하지 않은 것 같습니다, 이것은 하위 쿼리가 하나의 레코드를 반환하는 경우 동일한 상황에있는 모든 레코드를 설정하려고 시도합니다 (나는 생각하건 없건간에), 그렇지 않으면 일치하지 않는 레코드 세트 크기로 인해 넘어 질 것입니다. 또한 2 개의 테이블에서 countryNames를 가져와야하는 경우이 시나리오에서 UNION ALL을 수행해야 모든 결과가 같은 열에 표시됩니다. –

답변

0

두 가지 쿼리는 서로 다른 작업을 수행합니다.

첫 번째는 t1의 각 위치에 임의의 t2.CountryName을 할당하려고 시도하고 있습니다. 조건을 충족시키는 일부 t1.num이있을 수 있으므로 NULL 값을 할당하지 않습니다. t1.numbetween 조건을 충족하지 못할 때 첫 번째 쿼리에서 db1.t1에 대한 두 참조는 서로 다른 참조이므로 테이블간에 암시적인 cross join이 있습니다.

둘째는 행의 num 값이 조건을 충족시키는 위치에 임의의 t2.CountryName을 할당하는 것입니다. 다른 행의 경우, NULL이 지정됩니다.

내 생각에 두 번째 쿼리는 실제로 수행하려는 작업입니다.

관련 문제