0

顔認証をしています。グループ A の人物とグループ B の人物のデータベースがあります。A のすべての人物と B のすべての人物をチェックしたいと考えています。顔を検証するために実行しているさまざまなアルゴリズムがいくつかあります。これを行うために、次のテーブルを設定しました

comparison (
    id int,
    personA_id int,
    personB_id int,
)

facerecScore (
    id int,
    score int,
    comparison_id int,
    algo_id int,
 )

それで、私がテストしている最初のアルゴリズムとして、固有顔プログラムを実行していたとしましょう。固有顔のalgo_idは 1 になります。

私がしたいのは、テーブルに既存のレコードが存在しない比較から選択するクエリpersonAを作成することです.1であり、比較はその比較です。personBfacerecScorealgo_id

つまり、この 2 人に対して既に固有顔を実行したことがある場合は、再度実行する必要はありません。facerecscoreしたがって、テーブルalgo_idに 1のレコードが既にある比較を選択したくありません。

4

4 に答える 4

1

相関サブクエリが嫌いな人 (たとえば、パフォーマンス上の理由から、元のクエリが最適化されていない場合) は、左結合を使用して、実際に結合された行を除外することができます。

更新: @penfold の「すべてを検索」の回答に触発されて、algo_ids のリストがわかっている場合 (および短い場合) 、これは join+union の代替手段です。

select '1' algo_id, c.*
  from comparison c
  left join facerecScore f
    on c.id = f.comparison_id
    and f.algo_id = 1
  where f.id is null
union all
select '2' algo_id, c.*
  from comparison c
  left join facerecScore f
    on c.id = f.comparison_id
    and f.algo_id = 2
  where f.id is null
...

または、より一般的なもの (どちらが優れているかはわかりません):

select a.algo_id, c.id
  from comparison c
  cross join (select algo_id from facerecScore group by algo_id) a
  left join facerecScore f
    on c.id = f.comparison_id
    and f.algo_id = a.algo_id
  where f.id is null
于 2013-04-22T19:20:42.567 に答える