2012-01-03 2 views
3

안녕하세요, 흉골 질환에 대한 별개의 선택 요청을 할 가능성이 있습니까?Erlang - Mnesia - "Select distinct ID from Table"

ets에 한 테이블의 내용을 복사 할 수 있고 ets가 작동 할 수있는 해시 테이블이기 때문에 가능합니다. 하지만 아마도이 문제에 대한 좀 더 우아한 해결책이 있다고 생각했습니다.

감사합니다.

답변

4

마음에 들었는지 확실하지 않지만 QLC의 {unique, true} 옵션을 사용할 수 있습니다 (자세한 내용은 QLC documentation 참조).

나는 bag semantics가있는 test라는 mnesia 테이블을 만들었습니다. 각 행은 표 이름, 키 및 값으로 구성되어 있으므로 내 행은 다음과 같이 표시됩니다.

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. 

컴파일하고 = 출력이 다음 QH의 다음 버전을 사용하는 분류를 원한다면 당신은 고유 한 값을 선택하고 싶다면

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

위 ... 라인을

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

를 실행 , 다음 작동합니다 :

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

다시, 코드는 사용하여 고유 키의 목록을 얻을 수 있습니다 키에 대한 접근 방식을

1

을 설명하기 위해 단지이다 : 그것은 고유 키의 목록을 얻을 수 가방 내 테스트에서

mnesia:all_keys(Table). 

는.

관련 문제