質問
心理テストアプリケーションを作成しました。このアプリケーションでは、ユーザーに単語のリストが表示されます。ユーザーは、非常に説明する10個の単語を選択してから、部分的に自分自身を説明し、自分自身を説明しない言葉。アプリケーション自体は正常に機能しますが、メタデータの可能性を調査することに興味がありました。最初のカテゴリで最も頻繁に選択される単語と、最初のカテゴリで一度も選択されていない単語です。最初のクエリは問題ではありませんでしたが、2番目のクエリ(どの単語も選択されていない)には困惑します。
テーブル構造は次のとおりです。
table words: id, name
table choices: pid (person id), wid (word id), class (value between 1-6)
おそらく答えには単語と選択肢の間の左結合が含まれますが、choices.class = 1の修正ステートメントが必要であり、これが問題を引き起こしています。のようなものを書く
select words.name
from words left join choices
on words.id = choices.wid
where choices.class = 1
and choices.pid = null
データベース管理者はどこにも行かないようになります。 Delphi 7とFirebird 1.5を使用しています。
TIA、 いやいや
解決
たぶんこれは少し高速です:
SELECT w.name
FROM words w
WHERE NOT EXISTS
(SELECT 1
FROM choices c
WHERE c.class = 1 and c.wid = w.id)
他のヒント
そのような何かがトリックを行うはずです:
SELECT name
FROM words
WHERE id NOT IN
(SELECT DISTINCT wid -- DISTINCT is actually redundant
FROM choices
WHERE class == 1)
SELECT words.name
FROM
words
LEFT JOIN choices ON words.id = choices.wid AND choices.class = 1
WHERE choices.pid IS NULL
choices(class、wid)
にインデックスがあることを確認してください。
所属していません StackOverflow