2013-04-17 2 views
4

SQLite에서 관련 테이블의 행 수를 업데이트해야합니다.sqlite에서 하나의 select로 행의 여러 열을 업데이트

아래의 쿼리가 내가 원하는 것을하지만이 카운트 얻기 위해 테이블을 여러 번 안내 :

UPDATE overallCounts SET 
    total = (count(*) FROM widgets WHERE joinId=1234), 
    totalC = (count(*) FROM widgets WHERE joinId=1234 AND source=0), 
    totalL = (count(*) FROM widgets WHERE joinId=1234 AND source=2), 
    iic = (SELECT CASE WHEN COUNT(*)>0 THEN 1 ELSE 0 END FROM widgets WHERE joinId=1234 AND widgets.source=0), 
    il = (SELECT CASE WHEN COUNT(*)>0 THEN 1 ELSE 0 END FROM widgets WHERE joinId=1234 AND widgets.source=2) 
WHERE id=1234 

이 쿼리는 내가 빨리 원하는 것을 정확하게 검색하지만 업데이트 문에 출력을 켜야를 :

SELECT 
    count(*) as total, 
    sum(case when source=0 then 1 else 0 end) as totalC, 
    sum(case when source=2 then 1 else 0 end) as totalL, 
    case when source=0 then 1 else 0 end as iic, 
    case when source=2 then 1 else 0 end as il 
FROM widgets 
WHERE joinId=1234 

답변

4

SQLite는 UPDATE 쿼리에서 JOIN을 지원하지 않습니다. 디자인 상 SQLIte의 제한 사항입니다. 그러나 강력한 INSERT OR REPLACE 구문을 사용하여 SQLite에서 계속 수행 할 수 있습니다. 이것의 유일한 단점은 당신이 항상 당신의 overallCounts에 엔트리를 가질 것이라는 것입니다 (엔트리가 없다면 삽입 될 것입니다). 구문은 다음과 같습니다.

INSERT OR REPLACE INTO overallCounts (total, totalC, totalL, iic, il) 
SELECT 
    count(*) as total, 
    sum(case when source=0 then 1 else 0 end) as totalC, 
    sum(case when source=2 then 1 else 0 end) as totalL, 
    case when source=0 then 1 else 0 end as iic, 
    case when source=2 then 1 else 0 end as il 
FROM widgets 
WHERE joinId=1234 
ON CONFLICT REPLACE 
+0

이 메서드는 레코드의 추가 필드를 joinId = 1234로 덮어 씁니 까? – Sinchi

+0

아니오 – cha

+0

아니요, 기본 키 충돌로 행을 확실히 제거한 다음 입력 한 값만 삽입하여 다른 필드를 덮어 쓰지 않아야합니다. – nschwan94

12

주어진 문에서 ItemName과 ItemCategoryName은 모두 UPDATE로 단일 문에서 업데이트됩니다. 그것은 내 SQLite에서 일했습니다.

UPDATE Item SET ItemName='Tea powder', ItemCategoryName='Food' WHERE ItemId='1'; 
0

@cha 왜 존재하지 않습니까?

INSERT OR REPLACE INTO overallCounts (total, totalC, totalL, iic, il) 
SELECT 
    count(*) as total, 
    sum(case when source=0 then 1 else 0 end) as totalC, 
    sum(case when source=2 then 1 else 0 end) as totalL, 
    case when source=0 then 1 else 0 end as iic, 
    case when source=2 then 1 else 0 end as il 
FROM widgets 
WHERE joinId=1234 
AND EXISTS (SELECT joinId FROM overallCounts WHERE joinId=1234) 
ON CONFLICT REPLACE 
관련 문제