0

我有下表,其中记录了一些学术测验的答案:

回复

-SEMESTRE_ID(测验学期的外键)

-PERGUNTA_ID(测验问题的外键)

-DISCIPLINA_ID(被评估主题的外键)

-DOCENTE_ID(被评估教师的外键)

-QUIZ_ID(回答测验的每个人都有一个唯一的 quiz_id)

-TIPOAULA(类的类型,与此上下文无关)

-DATA(日期,与此上下文无关)

-ID(答案的唯一 ID)

-RESPOSTA(答案的值,从 1 到 5)

因此,一个给定学期的测验有多个不同科目的问题,可以由人们评估(不一定需要对所有问题进行投票)。

我想要实现的查询是:

id 21 学期测验的每个问题中至少有 5 分的科目的 id 和首字母缩写词是什么?

我已经使用计数策略解决了它:

SELECT DISCIPLINA.DISCIPLINA_ID, SIGLA
FROM RESPOSTAS, DISCIPLINA
WHERE RESPOSTAS.DISCIPLINA_ID = DISCIPLINA.DISCIPLINA_ID AND SEMESTRE_ID = 21 AND RESPOSTA = 5
GROUP BY DISCIPLINA.DISCIPLINA_ID, SIGLA
HAVING COUNT(DISTINCT PERGUNTA_ID) = (SELECT COUNT(DISTINCT PERGUNTA_ID) FROM RESPOSTAS WHERE SEMESTRE_ID = 21);

但这是一个作业,我们也被要求使用双重否定策略来解决它,我似乎无法理解如何达到预期的结果。

4

1 回答 1

3

这看起来像一个关系除法查询(如果我没记错的话),您正在寻找的双重否定示例是下面的查询。基本上它可以被解读为向我展示所有不存在问题的科目,而不是在得分为 5 分或以上的问题集中

SELECT DISCIPLINA_ID, SIGLA 
FROM XDISCIPLINA XD
WHERE NOT EXISTS ( -- there can not be any questions ...
    SELECT 1 FROM XRESPOSTAS XR
    WHERE SEMESTRE_ID = 21 
    AND NOT EXISTS ( -- that are not in the set of 5+
       SELECT 1 FROM XRESPOSTAS 
       WHERE PERGUNTA_ID = XR.PERGUNTA_ID 
         AND SEMESTRE_ID = 21
         AND RESPOSTA >= 5
         AND XD.DISCIPLINA_ID = DISCIPLINA_ID
    )
)

一篇关于这方面的好文章是:划分我们的立场: Joe Celko 的关系除法的 SQL。非常值得一读。

编辑:

我认为上面的查询由于缺少连接而执行得非常糟糕。这个版本应该表现得更好:

SELECT DISCIPLINA_ID, SIGLA 
FROM XDISCIPLINA XD
WHERE SEMESTRE_ID = 21 
  AND NOT EXISTS (
    SELECT 1 FROM XRESPOSTAS XR
    WHERE SEMESTRE_ID = 21 AND
    XD.DISCIPLINA_ID = DISCIPLINA_ID AND
      NOT EXISTS (
       SELECT 1 FROM XRESPOSTAS 
       WHERE PERGUNTA_ID = XR.PERGUNTA_ID 
         AND SEMESTRE_ID = 21
         AND RESPOSTA > 4
         AND XD.DISCIPLINA_ID = DISCIPLINA_ID
    )
)

另一种实现相同结果的方法似乎表现得更好:

SELECT DISCIPLINA_ID, SIGLA 
FROM XDISCIPLINA XD
WHERE NOT EXISTS (
  SELECT PERGUNTA_ID FROM XRESPOSTAS XR 
    WHERE SEMESTRE_ID = 21 AND XD.DISCIPLINA_ID = DISCIPLINA_ID 
  INTERSECT
  SELECT PERGUNTA_ID FROM XRESPOSTAS XR 
    WHERE SEMESTRE_ID = 21 AND XD.DISCIPLINA_ID = DISCIPLINA_ID AND RESPOSTA < 5
    )
于 2015-03-20T01:22:31.240 回答