有没有一种方法可以检查一个表是否在一个列中具有答案表中所有记录的某个特定ID?

时间:2019-03-29 04:46:59

标签: sql sql-server

我正在尝试比较两个表:一个具有结果的表和一个具有答案/键的表。我希望结果表具有与特定表ID的答案表完全匹配的记录。该结果表具有:

我正在使用SQL Server 2008,这是我的查询:

select id 
from Answer 
left outer join Result on Answer.mappingId = Result.mappingId
                       and Answer.answerValue = Result.answerValue
left outer join Check on Result.checkId = Check.checkId

这是我正在使用的表格:

结果表-在此示例中,我想要的是checkId = 100

id | mappingId   | checkId  |  answerValue     
---+-------------+----------+---------------
 1 | 15          | 100      |  1
 2 | 16          | 100      |  1
 3 | 17          | 100      |  1
 4 | 18          | 100      |  1
 5 | 15          | 200      |  1
 6 | 16          | 200      |  1
 7 | 17          | 200      |  2
 8 | 18          | 200      |  2

答案表:

id | mappingId   | answerValue
---+-------------+------------
 1 | 15          | 1          
 2 | 16          | 1            
 3 | 17          | 1            
 4 | 18          | 1            

结果表中,请注意,checkId具有相同的ID(ID为100的4和ID 200的4)。我想知道一个特定checkId的答案值是否均为1。所以checkId = 100的结果表就是我想要查询查找的结果表,因为它具有该单个id值的所有正确答案(该checkId = 100的4条记录,这是我想要的,因为答案表格有4个答案,映射ID也需要匹配,即:15、16、17、18)。但是对于200个来说,它并没有所有答案。它仅具有映射ID 15、16的正确答案。

结果表的示例不是我想要的,但看起来仍然可以通过我的查询

结果表-即使不应该通过

id | mappingId   | checkId  |  answerValue     
---+-------------+----------+---------------
 1 | 15          | 100      |  1
 2 | 16          | 100      |  1
 3 | 17          | 100      |  2
 4 | 18          | 100      |  2
 5 | 15          | 200      |  2
 6 | 16          | 200      |  2
 7 | 17          | 200      |  1
 8 | 18          | 200      |  1

这应该是不正确的,因为只有两个问题的正确答案值为1-对于checkId = 100的mappingId 15/16。但是问题在于,由于checkId = 200具有剩余的正确值- mappingId 17/18,我的查询仍然认为这是正确的,即使我想要一个特定的checkId = 100的所有人的mappingId:15、16、17、18的答案值均为1。注意:它只必须适用于任何一个特定的checkId,所以下面的内容还是我想要的:

id | mappingId   | checkId  |  answerValue     
---+-------------+----------+---------------
 1 | 15          | 100      |  2
 2 | 16          | 100      |  2
 3 | 17          | 100      |  2
 4 | 18          | 100      |  2
 5 | 15          | 200      |  1
 6 | 16          | 200      |  1
 7 | 17          | 200      |  1
 8 | 18          | 200      |  1

因为checkId 200具有mappingId:15、16、17、18,且所有answerValues均为1。

这就是我要退货的

id | mappingId   | checkId  |  answerValue     
---+-------------+----------+---------------
 5 | 15          | 200      |  1
 6 | 16          | 200      |  1
 7 | 17          | 200      |  1
 8 | 18          | 200      |  1

OR:

id | mappingId   | checkId  |  answerValue     
---+-------------+----------+---------------
 1 | 15          | 100      |  1
 2 | 16          | 100      |  1
 3 | 17          | 100      |  1
 4 | 18          | 100      |  1

如果以上任何一个都不成立,它将什么也不返回。它必须具有针对一个特定checkId的所有正确答案。基本上是全有还是全无。

我实际上返回的是错误的,因为它跨越了2个checkId's

id | mappingId   | checkId  |  answerValue     
---+-------------+----------+---------------
 1 | 15          | 100      |  1
 2 | 16          | 100      |  1
 3 | 17          | 200      |  1
 4 | 18          | 200      |  1

感谢大家的帮助!我是堆栈溢出的新手,所以让我知道我是否可以做得更好。我不知道如何为SQL查询着色,所以请原谅我,希望它可读。

1 个答案:

答案 0 :(得分:0)

从概念上讲,一种简单的方法是将两个表连接起来,然后通过checkId进行聚合,并断言每个答案都匹配:

SELECT
    c.checkId
FROM [Check] c
LEFT JOIN Answer a
    ON c.mappingId = a.mappingId AND c.answerValue = a.answerValue
GROUP BY
    c.checkId
HAVING
    COUNT(*) = COUNT(a.mappingId);

Demo