Erlang - Mnesia - эквивалентно «выбрать отдельный идентификатор из таблицы» - PullRequest
3 голосов
/ 03 января 2012

Привет, есть ли возможность сделать отдельный запрос на выборку в mnesia?

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

Спасибо.

Ответы [ 2 ]

4 голосов
/ 05 января 2012

Я не уверен, что это именно то, что вы имели в виду, но вы можете использовать опцию QLC {unique, true} (см. Документация QLC для получения дополнительной информации).

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

1. test, 1, 1
2. test, 2, 1
3. test, 2, 2
4. test, 3, 1
5. test, 3, 2
6. test, 3, 3
... etc.

Тогда этот простой модуль иллюстрирует мой подход. Обратите внимание, что вы должны включить библиотеку qlc, и в моем примере я выбираю разные ключи.

-module(test).
-export([select_distinct/0]).

-include_lib("stdlib/include/qlc.hrl").

select_distinct()->
    QH = qlc:q( [K || {_TName, K, _V} <- mnesia:table(test)], {unique, true}),
    F = fun() -> qlc:eval(QH) end,
    {atomic, Result} = mnesia:transaction(F),
    Result.

Компиляция и запуск

> c("/home/jim/test", [{outdir, "/home/jim/"}]).
> test:select_distinct(). 
> [4,1,2,3,5]

Если вы хотите отсортированный вывод, используйте следующую версию строки QH = ... выше

    QH = qlc:sort(qlc:q( [K || {_TName, K, _V} <- mnesia:table(test)], {unique, true})),

Если вы хотите выбрать разные значения, будет работать следующее:

QH = qlc:sort(qlc:q( [V || {_TName, _K, V} <- mnesia:table(test)], {unique, true})),

Опять же, код просто для иллюстрации подхода

1 голос
/ 10 июля 2012

Для ключей вы можете получить список уникальных ключей, используя:

mnesia:all_keys(Table).

Из моих тестов для сумок получается список уникальных ключей.

...