如何在SQL查询中获取缓存未命中?

时间:2011-12-25 22:17:18

标签: sql sqlite caching

我在SQlite中有一个表,我用来缓存一些数据。我完全没有写一个SQL查询,当给出一个x字符串列表时,它将返回一个不在表中的子集y。我知道我可以逐个查询并检查一个空的结果,但我想知道是否有办法做到这一点,返回一个漂亮,整齐的字符串没有缓存(不在表中)。

FWIW我正在使用sqlite3和Python。到目前为止我得到的查询类似于

select e from cache where cache.fk = x and e in (a, b, c);
,它接近但却给出了我想要的相反行为(它返回的值是缓存命中)。

我也理解在这种情况下,在关键字/值存储上使用关系数据库略微不合适,但即使我要切换,我仍然有兴趣看看如何做到这一点。

1 个答案:

答案 0 :(得分: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
    )