我有2个表格问答表。 问题表有
ID Question_Text
1 Question1
2 Question2
3 Question3
答案表
Question_ID Answer_text Answered_by
1 Ans1 User1
1 Ans2 User2
1 Ans3 User3
2 Ans4 User1
我需要找出已经回答了哪些问题? 期望的结果
ID Question_Text Answered
1 Question1 true/1
2 Question2 true/1
3 Question3 false/0
我编写了以下查询以查找是否使用EXISTS回答了问题。我需要回答值true / false,并且还希望对此查询进行微调,以便它在answer表中检查第一次出现并获取值为true / false,而不是在answer表中运行数千个值。
SELECT *
FROM QUESTIONS A
WHERE EXISTS (SELECT *
FROM ANSWERS B
WHERE A.QUESTION_ID = B.QUESTION_ID);
答案 0 :(得分:2)
一个简单的LEFT JOIN
会:
SELECT Q.*,
CASE WHEN A.Question_ID IS NULL THEN 0 ELSE 1 END Answered
FROM Question Q
LEFT JOIN ( SELECT DISTINCT Question_ID
FROM Answer) A
ON Q.ID = A.Question_ID;
答案 1 :(得分:0)
尝试:
SELECT
Q.*,
CASE
WHEN EXISTS
( SELECT *
FROM ANSWERS A
WHERE A."Question_ID" = Q.ID
) THEN 'true/1'
ELSE 'false/0'
END Answered
FROM QUESTIONS Q
ORDER BY ID
这样做的好处是不必首先使用DISTINCT
ANSWERS。如果ANSWERS很大并且在Question_ID上有索引,那么它可能会更快,特别是对于选定的问题。它仍然不是一个合适的半连接解决方案。查询优化器可能会使用真实数据对此和@Lamak解决方案感到惊讶。