您好,有没有可能对Mnesia进行不同的选择请求?
我可以将一个表的内容复制到ETS中,由于ETS是哈希表,所以可能会起作用。但我认为可能有更优雅的解决方案。
谢谢。
我不确定这是否符合您的意图,但是您可以使用 QLC 的 {unique, true} 选项(有关更多信息,请参见 QLC 文档)。
我创建了一个具有 bag 语义的 Mnesia 表,名为 test。每行由表名称、Key 和 Value 组成,因此我的行看起来像:
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.
-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 = 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})),
再次强调,该代码仅用于说明一种方法。
如果您想获取键列表,可以使用以下命令获取唯一键列表:
mnesia:all_keys(Table).