2011-12-25 3 views
3

일부 데이터를 캐시하는 데 사용하는 테이블이 SQlite에 있습니다. 나는 완전히 x 문자열의 목록이 주어질 때 테이블에없는 부분 집합 y를 반환하는 SQL 질의를 작성하는 것에 매달렸다. 나는 하나 하나를 쿼리하고 빈 결과를 확인할 수 있지만 캐싱되지 않은 문자열 (테이블에는 없음)을 멋지고 깔끔하게 반환하는 방법이 있는지 알고 싶습니다.SQL 쿼리에서 캐시 누락을 얻으려면 어떻게해야합니까?

FWIW 저는 sqlite3과 Python을 사용하고 있습니다. 내가 지금까지 가지고있는 쿼리는 가까운 것이지만 (캐시 히트가 될 값을 반환하는) 원하는대로 반대 동작을 제공하는

select e from cache where cache.fk = x and e in (a, b, c);
과 같은 것입니다.

이 경우 키/값 저장소를 통해 관계형 데이터베이스를 사용하는 것은 다소 부적절하지만, 전환하더라도 여전히 수행 방법을 확인하는 데 관심이 있습니다. 당신이 캐싱하고 그들이 테이블에서 온 것들의 설정 값 거기에 가정

+0

우선 'in'대신 'in in'을 사용할 수 있습니다. – fge

+0

DB에있는 것들을 반환하지만 캐시 히트/미스에 대해 테스트하고있는 것은 아닙니다. ex db에 (a, b, c, x)가 아닌 a, b, c, d 및 I 쿼리가 있으면 d를 얻습니다. 캐시 미스에 대한 쿼리 (x를 반환하는 쿼리)를 원합니다. – ldrg

답변

1

, not exists 사용

select 
    v.e 
from 
    vals v 
where 
    v.fk = x 
    and v.e in (a,b,c) 
    and not exists (
     select 
      1 
     from 
      cache c 
     where 
      c.fk = v.fk 
      and c.e = v.e 
    ) 

사용 가능한 값의 테이블이 없어 그냥 세트를 던지는 경우 다시 다음과 같이 동적 테이블을 사용합니다.

select 
    v.e 
from 
    (
    select a as e 
    union all 
    select b as e 
    union all 
    select c as e 
    ) v 
where 
    not exists (
     select 
      1 
     from 
      cache c 
     where 
      c.fk = x 
      and c.e = v.e 
    ) 
+0

먼저, 위와 그 이상으로 가서 두 예제를 모두 제공해 주셔서 감사합니다! 내 DB를 선택하면 동적 테이블을 사용할 수 없지만 나중에 다른 사람이 방황하면 감사하게 생각합니다. 누구든지 SQLite 메서드에 관심이 있다면 임시 테이블을 만들고 캐시 히트를 테스트하는 모든 값의 대량 삽입을 수행했습니다. – ldrg

관련 문제