Как написать запрос, возвращающий невыбранные записи - PullRequest
0 голосов
/ 24 октября 2009

Я написал приложение для психологического тестирования, в котором пользователю предоставляется список слов, и он / она должен выбрать десять слов, которые очень описывают себя, затем выбрать слова, которые частично описывают сам, и слова, которые не описывают себя. Само приложение прекрасно работает, но мне было интересно изучить возможности метаданных: какие слова чаще всего выбирались в первой категории, а какие никогда не выбирались в первой категории. Первый запрос не был проблемой, но второй (слова которого никогда не были выбраны) оставляет меня в тупике.

Структура таблицы следующая:

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.

ТИА, No'am

Ответы [ 3 ]

1 голос
/ 24 октября 2009

Может быть, это немного быстрее:

SELECT w.name
FROM words w
WHERE NOT EXISTS
   (SELECT 1
    FROM choices c 
    WHERE c.class = 1 and c.wid = w.id)
1 голос
/ 24 октября 2009

Нечто подобное должно сработать:

SELECT name
FROM words
WHERE id NOT IN
   (SELECT DISTINCT wid   -- DISTINCT is actually redundant
    FROM choices 
    WHERE class == 1)
0 голосов
/ 24 октября 2009
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).

...