0

この形式の大きなテーブル (20,000,000 行以上) があります。

id ref  feature val
1  a    pos     pc
2  a    gen     m
3  a    syll    Cv
4  b    pos     pc
5  b    L5      harry
6  c    syll    Cv
7  d    gen     m

feature+val の複数のペアを満たす参照のリストを選択するにはどうすればよいですか?

例:Select distinct ref where feature='pos' and val = 'pc'a,b Select distinct ref where feature = 'gen' and val= 'm'を与える a,d を与える

しかし、どのように結合された参照 a、b、d を返すことがfeature='pos' and val = 'pc'できfeature = 'gen' and val= 'm'ますか?

同じ検索で、そのような多くのペアにソリューションを拡張できる必要があります。

検索は高速である必要があるため、インデックスに関するアドバイスも役立ちます。

各機能と値のペアに対して 1 つずつ、同じテーブルから N 回選択する必要がありますか? もしそうなら、どのように?

4

3 に答える 3

1

「OR」を使用して、そのような組み合わせを選択できます。

Select distinct ref 
from table
where ( feature='pos' and val = 'pc')
  or ( feature = 'gen' and val= 'm' )

それが扱いにくすぎる場合は、feature / val の組み合わせを別のテーブルに移動して、その上で結合することをお勧めします。

feature 列と val 列を持つ join_table という名前の結合テーブルがある場合 (今ではインスピレーションを得た名前があります!)、次のようにすることができます。

select distinct ref
from table t
  inner join join_table j on t.feature = j.feature and t.val = j.val
于 2012-06-26T06:19:33.290 に答える
0

通常、OR文を使用してこれらの句を追加します。

  SELECT DISTINCT ref
  FROM   YourTable
  WHERE  (feature = 'pos' AND val = 'pc')
         OR (feature = 'gen' AND val = 'm')
         ...

と の両方を連結する際に永続的な計算列を使用することで、これを少し単純化できる場合が あります。featureval

  SELECT DISTINCT ref
  FROM   YourTable
  WHERE  (featureval = 'pospc')
         OR (featureval = 'genm')

ORしかし、ステートメントの連鎖は残ります。

インデックス

各ステートメントのパフォーマンスは、実行計画を見て評価する必要がありますが、特定のステートメントについては、Covering Index をオンにして(feature, val, ref)も害はありません。

于 2012-06-26T06:20:10.583 に答える
0
sqlite> CREATE TABLE t (id INT, ref VARCHAR, feature VARCHAR, val VARCHAR);
sqlite> 
sqlite> INSERT INTO t (id, ref, feature, val) VALUES (1,  "a",    "pos",     "pc");
sqlite> INSERT INTO t (id, ref, feature, val) VALUES (2,  "a",    "gen",     "m");
sqlite> INSERT INTO t (id, ref, feature, val) VALUES (3,  "a",    "syll",    "Cv");
sqlite> INSERT INTO t (id, ref, feature, val) VALUES (4,  "b",    "pos",     "pc");
sqlite> INSERT INTO t (id, ref, feature, val) VALUES (5,  "b",    "L5",      "harry");
sqlite> INSERT INTO t (id, ref, feature, val) VALUES (6,  "c",    "syll",    "Cv");
sqlite> INSERT INTO t (id, ref, feature, val) VALUES (7,  "d",    "gen",     "m");
sqlite> 
sqlite> SELECT DISTINCT ref FROM t WHERE (feature = 'pos' AND val = 'pc') OR (feature = 'gen' and val= 'm');
a
b
d
sqlite> 

実行時間は線形である必要があり、2000 万行は大きく見えるかもしれませんが、今日のハードウェアとほとんどの実装ではそれほど問題にならないはずです。フィルター タイプに対するインデックス作成によりパフォーマンスが向上する可能性があります。行が固定幅であることを確認してください。改善。

さらに構成が必要な場合ORは、アイデアをよく使用してそれらを追加するだけです。テストすることをお勧めします。クエリにかかる時間を確認すると、システムも実装もわかりませんが、長すぎるのではないかと真剣に疑っています。使っているので、何とも言えません。

于 2012-06-26T06:22:02.387 に答える