2014-01-17 5 views
0

패키지 목록 (10000 개의 고유 항목 순서)과 특정 패키지의 해당 범주 (100 개의 고유 항목 순서)가있는 SQL 테이블이 있습니다. 주어진 패키지는 둘 이상의 범주에 속할 수 있습니다 (즉, 15000 고유 조합 순서, 즉 테이블 크기 임).sql : 다른 열이 네임 스페이스에서 충돌을 일으키는 경우 열 업데이트

모든 패키지 이름은 고유해야하며 범주 이름과 충돌하지 않지만이 경우에는 나타나지 않습니다.

10k 패키지 중 하나가 100 개 카테고리 중 하나와 동일한 이름을 갖고 있고, 그렇다면 접미어 ,pkg을 포함하도록 모든 패키지 이름을 수정해야합니다. 네임 스페이스를 공유하고 고유하게 유지할 수 있습니다.


가장 간단한 경우는이 것이로 변환되어야한다

sqlite> select * from categories where value=fullpkgpath; 
lang/mono|lang/mono 

sqlite> select fullpkgpath, value from categories where fullpkgpath="lang/mono"; 
lang/mono|devel 
lang/mono|lang 
lang/mono|lang/mono 

:

lang/mono,pkg|devel 
lang/mono,pkg|lang 
lang/mono,pkg|lang/mono 
그러나

, 또한 더 많은이 경우가있을 수 있습니다 간접적 인 충돌 (이 패키지가 속하지 않는 카테고리와 충돌 함) :

이것으로 변환해야 6,
sqlite> select * from categories where fullpkgpath="lang/erlang" or fullpkgpath="lang/node"; 
lang/erlang|lang 
lang/node|devel 
lang/node|lang 
lang/node|lang/python 

: lang/erlanglang/node 모두 때문에

lang/erlang,pkg|lang 
lang/node,pkg|devel 
lang/node,pkg|lang 
lang/node,pkg|lang/python 

도 스스로 범주 있습니다 :

sqlite> select * from categories where value="lang/erlang" limit 8; 
databases/erl-Emysql|lang/erlang 
databases/erl-couchbeam|lang/erlang 
databases/erl-epgsql|lang/erlang 
databases/erl-sqerl|lang/erlang 
devel/erl-automeck|lang/erlang 
devel/erl-bear|lang/erlang 
devel/erl-depsolver|lang/erlang 
devel/erl-ej|lang/erlang 

sqlite> select * from categories where value="lang/node" limit 8; 
databases/node-pg|lang/node 
databases/node-sqlite3|lang/node 
devel/node-async|lang/node 
devel/node-bindings|lang/node 
devel/node-buffer-writer|lang/node 
devel/node-cloned|lang/node 
devel/node-expresso|lang/node 
devel/node-fibers|lang/node 

나는 오픈 BSD에 sqlite3를하고 perl을 사용하고 있습니다 . 필요한 경우 databaseavailable on ftp입니다.

+0

왜 단지'추가하지, pkg'을 * 모든 * 패키지 이름의 끝? – ThisSuitIsBlackNot

+0

또한 이름이 고유해야하는 이유는 무엇입니까? 이유가 있기 때문에 별도의 열에 있습니다. – ThisSuitIsBlackNot

+0

다른 네임 스페이스에서 고유하게 액세스 할 수 있도록하려면 고유해야합니다. 모든 패키지에', pkg '를 추가하는 것은 못생긴 일입니다. 충돌하는 이름을 가진 10 개의 패키지 순서 만 존재하기 때문에 10000 패키지의 나머지 부분은 그 때문에 이름을 바꾸는 것이 불공평 할 수 있습니다. – cnst

답변

2

이 값은 값의 집합에 있는지 여부를 확인하려면에 사용 :

UPDATE categories 
SET fullpkgpath = fullpkgpath || ',pkg' 
WHERE fullpkgpath IN (SELECT value 
         FROM categories) 
+0

위대한 작품, 감사합니다! 나는 당신이 상관하지 않는 경우 관련된 후속 질문이있다 : http://stackoverflow.com/questions/21195043/sql-update-a-given-field-in-all-tables-instead-of-just- 원탁 – cnst

관련 문제