2013-05-15 143 views
2

请注意,在下面的查询中,括号内的前两个查询中,我添加了两个重复的查询,我相信这不是一个好的做法。我需要在需要价值的地方随时重复此查询。在SELECT中添加逻辑

SQL Server正在抛出关于不在SELECT关键字内部写入DECLARE的异常。我可以做什么或我缺少什么来重构它?根据需要

SELECT A.StudentId, 
    case 
     when B.OverwrittenScore is not null 
     then B.OverwrittenScore 
     else 0 
    end AS FinalScore 
FROM dbo.Students AS A 
LEFT JOIN dbo.OverwrittenScores B 
    ON B.StudentId = A.StudentId 
    AND B.AssignmentId = @assignmentId 

如果你想使用其他选择的东西,那么你可以添加更多的联接:

SELECT A.StudentId, 
(
    CASE WHEN (SELECT B.OverwrittenScore 
     FROM dbo.OverwrittenScores AS B 
     WHERE B.StudentId = A.StudentId 
     AND B.AssignmentId = @assignmentId 
     ) IS NOT NULL 
      THEN (
       SELECT B.OverwrittenScore 
       FROM dbo.OverwrittenScores AS B 
       WHERE B.StudentId = A.StudentId 
       AND B.AssignmentId = @assignmentId) 
      ELSE (-- ANOTHER QUERY, BY THE MOMENT: SELECT 0) 
    END 
) AS FinalScore 
FROM dbo.Students AS A 
+1

我没有看到在你的查询'DECLARE' - 很难知道解决什么当我们看不到问题时。 –

+0

什么是确切的例外? – logixologist

+0

好吧,当我执行两个标量查询时,我正在写'DECLARE @value; SET @value = SELECT ...'而不是CASE关键字 –

回答

6

我的建议是要看看使用JOIN

SELECT A.StudentId, 
    case 
     when B.OverwrittenScore is not null 
     then B.OverwrittenScore 
     else c.whatever 
    end AS FinalScore 
FROM dbo.Students AS A 
LEFT JOIN dbo.OverwrittenScores B 
    ON B.StudentId = A.StudentId 
    AND B.AssignmentId = @assignmentId 
LEFT JOIN anothertable c 
    ON a.col = c.col 

甚至可以使用COALESCE替换空值:

SELECT A.StudentId, 
    coalesce(B.OverwrittenScore, 0) as FinalScore 
FROM dbo.Students AS A 
LEFT JOIN dbo.OverwrittenScores B 
    ON B.StudentId = A.StudentId 
    AND B.AssignmentId = @assignmentId 
+1

或简单地'isnull(B.OverwrittenScore,0)'而不是'case'语句 – GolfWolf

+0

@ w0lf是的,但他们说在else部分有另一个选择,所以CASE可能会更好。 – Taryn

+1

或'coalesce()',因为这是SQL标准。 –

0

不知道在哪里关于DECLARE错误是从哪里来的,但你可以改变你做什么

SELECT 
    A.StudentId, 
    COALESCE(B.OverwrittenScore, 0) AS FinalScore 
FROM dbo.Students AS A 
LEFT JOIN dbo.OverwrittenScores AS B 
    ON A.StudentId = B.StudentId AND B.AssignmentId = @assignmentId