Как я могу получить пропуски кэша в запросе SQL? - PullRequest
3 голосов
/ 26 декабря 2011

У меня есть таблица в SQlite, которую я использую для кэширования некоторых данных. Я полностью зациклен на написании SQL-запроса, который при получении списка строк x вернет подмножество y, которого нет в таблице. Я понимаю, что мог бы просто запросить один за другим и проверить пустой результат, но я хотел бы знать, есть ли способ сделать это, который возвращает хороший, аккуратный список строк, которые не были кэшированы (не в таблице). *

FWIW Я использую sqlite3 и Python. Запрос, который я получил до сих пор, похож на

select e from cache where cache.fk = x and e in (a, b, c);
, который близок, но дает поведение, противоположное тому, что я хочу (он возвращает значения, которые будут попадать в кэш).

Я также понимаю, что в этом случае немного неуместно использовать реляционную базу данных над хранилищем ключей / значений, но даже если бы мне пришлось отказаться, мне все еще интересно посмотреть, как это будет сделано.

1 Ответ

1 голос
/ 29 декабря 2011

Предполагая, что есть установленное значение вещей, которые вы кэшируете, и что они приходят из таблицы, используйте 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
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...