我无法理解为什么这不起作用:
select distinct a.QuestionID,a.QuestionName,b.AnswerID,b.AnswerName
from @TempExportList a
join tblAnswers b
on a.QuestionID = b.QuestionID
where a.PaperID=@PaperID
order by (case when a.QuestionName='A' then 0
when a.QuestionName='B' then 1
else a.QuestionID
end)
我收到以下错误 -
ORDER BY项目必须出现在 如果SELECT DISTINCT是,则选择列表 指定。
但这很好用:
select distinct a.QuestionID,a.QuestionName,b.AnswerID,b.AnswerName
from @TempExportList a
join tblAnswers b
on a.QuestionID = b.QuestionID
where a.PaperID=@PaperID
order by a.QuestionID
答案 0 :(得分:8)
错误信息完美地解释了问题。
在第一个示例中,ORDER BY
项目CASE WHEN ... END
- 未显示在SELECT
列表中。
在第二个示例中,ORDER BY
项目a.QuestionID
- 确实出现在SELECT
列表中。
要修复第一个示例,您需要执行以下操作:
SELECT DISTINCT a.QuestionID, a.QuestionName, b.AnswerID, b.AnswerName,
CASE WHEN a.QuestionName = 'A' THEN 0
WHEN a.QuestionName = 'B' THEN 1
ELSE a.QuestionID
END
FROM @TempExportList AS a
JOIN tblAnswers AS b
ON a.QuestionID = b.QuestionID
WHERE a.PaperID = @PaperID
ORDER BY CASE WHEN a.QuestionName = 'A' THEN 0
WHEN a.QuestionName = 'B' THEN 1
ELSE a.QuestionID
END
答案 1 :(得分:4)
你可以通过CTE解决这个问题
;WITH T AS
(
SELECT DISTINCT a.QuestionID,a.QuestionName,b.AnswerID,b.AnswerName
FROM @TempExportList a
JOIN tblAnswers b
ON a.QuestionID = b.QuestionID
WHERE a.PaperID=@PaperID
)
SELECT *
FROM T
ORDER BY
CASE
WHEN QuestionName='A'
THEN 0
WHEN QuestionName='B'
THEN 1
ELSE QuestionID
END
答案 2 :(得分:2)
我会认为这个消息是自我解释的。
您已在a.QuestionID,a.QuestionName,b.AnswerID和b.AnswerName上选择了不同的。因此,对于每个字段,可能存在具有相同值的数据行,但对于case
语句,可能存在不同的数据行。
考虑一下
a.QuestionID a.QuestionName b.AnswerID b.AnswerName [case statement]
1 'One' 2 'Two' 0
1 'One' 2 'Two' 1
查询如何知道最后一列中的哪个值在订单中使用?是0吗?是1?很简单,它无法确定,所以它不能使用它,因此错误。
第二个例子很好,因为a.QuestionID确实出现在SELECT列表中,并且查询可以愉快地应用排序。