我在SQlite中有一个表,我用来缓存一些数据。我完全没有写一个SQL查询,当给出一个x字符串列表时,它将返回一个不在表中的子集y。我知道我可以逐个查询并检查一个空的结果,但我想知道是否有办法做到这一点,返回一个漂亮,整齐的字符串没有缓存(不在表中)。
FWIW我正在使用sqlite3和Python。到目前为止我得到的查询类似于
select e from cache where cache.fk = x and e in (a, b, c);,它接近但却给出了我想要的相反行为(它返回的值是缓存命中)。
我也理解在这种情况下,在关键字/值存储上使用关系数据库略微不合适,但即使我要切换,我仍然有兴趣看看如何做到这一点。
答案 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
)