選択されていないレコードを返すクエリを作成する方法

StackOverflow https://stackoverflow.com/questions/1616969

  •  06-07-2019
  •  | 
  •  

質問

心理テストアプリケーションを作成しました。このアプリケーションでは、ユーザーに単語のリストが表示されます。ユーザーは、非常に説明する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)にインデックスがあることを確認してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top