SQLite에서 테이블을 조인하는 동안 어떻게 업데이트합니까?


92

나는 시도했다 :

UPDATE closure JOIN item ON ( item_id = id ) 
SET checked = 0 
WHERE ancestor_id = 1

과:

UPDATE closure, item 
SET checked = 0 
WHERE ancestor_id = 1 AND item_id = id

둘 다 MySQL에서 작동하지만 SQLite에서 구문 오류가 발생합니다.

이 업데이트 / 조인이 SQLite 버전 3.5.9에서 작동하도록하려면 어떻게해야합니까?


답변:


128

당신은 할 수 없습니다. SQLite 는 UPDATE 문에서 JOIN을 지원하지 않습니다 .

그러나 대신 하위 쿼리를 사용하여이 작업을 수행 할 수 있습니다.

UPDATE closure SET checked = 0 
WHERE item_id IN (SELECT id FROM item WHERE ancestor_id = 1);

또는 그런 것; 스키마가 정확히 무엇인지 명확하지 않습니다.


20
이것이 까다로워지는 곳은 연결 방향을 반전하기 위해 한 테이블에서 다른 테이블로 열을 복사하는 것입니다. MySQL에서 foos.bar_id 열을 생성 한 다음 bars.foo_id 열 update foos join bars on bars.foo_id = foos.id set foos.bar_id = bars.id을 삭제하는 것과 같은 작업을 수행 할 수 있습니다. SQLite에서 어떻게이 작업을 수행 할 수 있습니까? 아는 사람이 있으면 확실히 사용할 수 있습니다.
hoff2 2011 년

@ hoff2 사실, 이것은 아마도 이것을하는 가장 간단한 방법 일 것입니다. 제 경우에는 WHERE EXISTS 부분도 필요하지 않았습니다. stackoverflow.com/a/3845931/847201
ACK_stoverflow

6

REPLACE 를 사용할 수도 있고 조인과 함께 선택을 사용할 수도 있습니다. 이렇게 :

REPLACE INTO clusure 
 SELECT sel.col1,sel.col2,....,sel.checked --checked should correspond to column that you want to change
FROM (
 SELECT *,0 as checked FROM closure LEFT JOIN item ON (item_id = id) 
 WHERE ancestor_id = 1) sel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.