我正在尝试比较两个表:一个具有结果的表和一个具有答案/键的表。我希望结果表具有与特定表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查询着色,所以请原谅我,希望它可读。
答案 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);