Oracle SQL查询根据if值是否返回1或0

时间:2016-07-21 17:39:34

标签: sql oracle

我有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);

2 个答案:

答案 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解决方案感到惊讶。