我写了一个心理测试应用程序,其中向用户提供了一个单词列表,并且他/她必须选择非常描述自己的十个单词,然后选择部分单词形容自己,以及不描述自己的话语。应用程序本身工作正常,但我有兴趣探索元数据的可能性:第一类中最常选择的单词,以及第一类中从未选择过哪些单词。第一个查询不是问题,但第二个(从未选择过的单词)让我感到难过。
表结构如下:
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, No'am
答案 0 :(得分:1)
这样的事情可以解决问题:
SELECT name
FROM words
WHERE id NOT IN
(SELECT DISTINCT wid -- DISTINCT is actually redundant
FROM choices
WHERE class == 1)
答案 1 :(得分:1)
也许这有点快:
SELECT w.name
FROM words w
WHERE NOT EXISTS
(SELECT 1
FROM choices c
WHERE c.class = 1 and c.wid = w.id)
答案 2 :(得分:0)
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)
上有索引。