2012-05-08 65 views
0

我遇到了此案例陈述的问题。我不知道我在做什么错,但是我得到错误:与案例陈述相关的问题

当子查询没有与EXISTS一起引入时,只能在选择列表中指定一个表达式。

我有一个情况,当字段等于一个值,然后做一个左外连接,但如果该字段等于一个不同的值,然后做一个内部连接。 这是我的查询:

SELECT
case when oqt = '26' then

(Select qm.id_oqm, cast(isNull(id_eval, '') as varChar(50)) + ' - ' + qm.methodName as methodName, qm.methodName as actualMethod,cv.* FROM OQMethods QM left outer join courseversions cv on cv.evalid = QM.id_eval and cv.courselanguage = 'EN' and cv.courseactive='Y' and cv.id_cp > 0 WHERE QM.id_oqt in (SELECT tempoq.oqt FROM tempoq INNER JOIN OQMethods ON tempoq.oqt = OQMethods.id_oqt)and active = 1) END, case when oqt = '31' then (Select qm.id_oqm, cast(isNull(id_eval, '') as varChar(50)) + ' - ' + qm.methodName as methodName, qm.methodName as actualMethod,cv.* FROM OQMethods QM inner join courseversions cv on cv.evalid = QM.id_eval and cv.courselanguage = 'EN' and cv.courseactive='Y' and cv.id_cp > 0 where QM.id_oqt in (SELECT tempoq.oqt FROM tempoq INNER JOIN OQMethods ON tempoq.oqt = OQMethods.id_oqt) and active = 1) END from tempoq
+0

您试图在一列上放置多个列(并且显然也包含多行),当然它会发送一个错误 – Lamak

回答

4

的情况是,必须计算为一个值的表达式。你有选择语句返回多个值。

这似乎是你想要使用Case,就像它是一个C#开关?如果是这样的话,那么你可能会更好地使用IF ELSE IF构造。

2

它看起来像你想做这样的事情,而不是使用CASE语句。

DECLARE @t int 
-- This would contain your oqt value 
SET @t =1 


IF @t = 1 
BEGIN 
    SELECT * FROM tableA 
END 
ELSE IF @t = 2 
BEGIN 
    SELECT * FROM TableB 
END 
0
Select qm.id_oqm, cast(isNull(id_eval, '') as varChar(50)) + ' - ' + qm.methodName as methodName, qm.methodName as actualMethod,cv.* 
FROM OQMethods QM 
inner join tempoq on tempoq.oqt = QM.id_oqt 
left outer join courseversions cv on cv.evalid = QM.id_eval and cv.courselanguage = 'EN' and cv.courseactive='Y' and cv.id_cp > 0 
WHERE active = 1 and (tempoq.oqt = '26' or (tempoq.oqt = '31' and courseversions.* is not null)) 

left outer join手段加入OQMethods的数据甚至从courseversions没有匹配的数据, 然后用空courseversions.*inner join过滤数据。

希望我有正确的理解。

+0

谢谢,一切都很好,但我可以有超过oqt的值,我有弄清楚我的if语句是什么时候这些值等于26或31。 –