Sql:查找答案是否存在

标签 sql sql-server sql-server-2008 stored-procedures

我有两张表,一张是问题,一张是答案。 questions 模式由 questionid、question、module id 组成。一个moduleid可能有很多疑问。

Questionid   Question    Moduleid(FK)
--------     -----       -------
1            q1             1
2            q2             1
3            q4             2
4            q5             2

答案模式由 3 列组成

answerid     Answer    questionid(FK)
--------     -----       -------
1            a1             1
2            a2             2
3            a4             3
4            a5             4

我正在尝试构建一个存储过程,我将作为参数发送 tblquestions 的 @moduleid,如果在 tblquestions 中回答了特定 moduleid 的所有问题,我希望它返回“1”。 (一个问题在 tblanswers 中只有一个答案)或者如果没有回答所有问题则返回 0。关于如何采用这种方法有什么帮助吗?

最佳答案

也许有更简单的方法,但这应该可以工作,并且可以轻松修改它以返回所有已回答/未回答的模块或缺少模块的答案等。

SELECT CASE 
     WHEN EXISTS (SELECT 1 
                  FROM   tblquestions AS q 
                         INNER JOIN tblanswers AS a 
                                 ON q.questionid = a.questionid 
                  WHERE  ( q.moduleid = @ModuleId ) 
                         AND ( NOT EXISTS (SELECT 1 
                                           FROM   tblquestions AS q 
                                                  LEFT OUTER JOIN 
                                                  tblanswers AS a 
                                                               ON 
                                                  q.questionid = 
                                                  a.questionid 
                                           WHERE  ( q.moduleid = @ModuleId ) 
                                                  AND ( a.answerid IS NULL ) 
                                          ) )) 
   THEN 1  ELSE 0 
   END  AS AllQuestionsAnswered

Here's the sql-fiddle对于所有模块 ID,结果为:

  • 模块 ID = 1 => 1
  • 模块 ID = 2 => 1
  • 模块 ID = 3 => 0

关于Sql:查找答案是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14412967/

相关文章:

mysql - 高效查询以从 sql 中的事件日志表获取步骤持续时间到累积快照事实

SQL Server服务启动失败

java - 使用 JDBC 连接到 SQL Server

sql-server - 在使用 sql 脚本添加外键之前检查外键

sql-server-2008 - CFDBINFO 不获取默认值

sql - 为什么这个查询需要一个参数?

sql - 根据先前查询的结果更新表

sql - LINQ 右外连接,连接中有多个条件

MySQL - 选择具有最大时间戳的唯一列

sql-server - TSQL - Select 中的 While 循环?