在投影内声明变量

Dar*_*Zon 0 sql t-sql sql-server sql-server-2008

请注意,我需要声明一个变量,这是另一个查询的结果.如果不这样做,我需要在需要值的任何时候重复此查询.

SQL Server抛出了一个关于不在关键字DECLARE内写入的异常SELECT.我能做什么或者我缺少什么?

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
Run Code Online (Sandbox Code Playgroud)

在括号内我需要实现一些逻辑,我的意思是可能实现另外两个查询.我在想,如果在这里我可以使用BEGIN关键字,但它没有成功

Eri*_*ikE 7

你不需要那么疯狂.你想要做的事情有很多概念上的问题.

  1. 您不能在查询中声明变量.

  2. 标量变量只能包含一个值.

  3. SQL Server中的标量变量始终以@.游标变量可以是普通标识符,但你绝对不需要游标.

  4. 一个简单的JOIN将做你正在寻找的.子查询方法有效,但SELECT很难(在语句中坚持查询),不能提取多个列值,并且不能像查询一样在整个查询中重用JOIN.

  5. 您可以CASE直接在列上使用语句.没有必要首先尝试将值放入变量中.而这无论如何都行不通(见#2).

  6. 您可以使用IsNullCoalesce函数将a NULL转换为0更简单的语法.

  7. 我鼓励你使用提示表而不是使用A和的别名B.例如,Sfor StudentsOfor OverwrittenScores.

考虑到所有这些要点,你可以做这样的事情:

SELECT
   S.StudentId,
   OverwrittenScore = Coalesce(O.OverwrittenScore, 0)
FROM
   dbo.Students S
   LEFT JOIN dbo.OverwrittenScores O
      ON S.StudentId = O.StudentID
      AND O.AssignmentId = @assignmentId
   LEFT JOIN dbo.SomeOtherTable T -- add another join here if you like
      ON S.StudentID = T.StudentID
      AND O.OverwrittenScore IS NULL
Run Code Online (Sandbox Code Playgroud)

UPDATE

LEFT JOIN在上面为你添加了另一个.你看到它如何加入条件O.OverwrittenScore IS NULL吗?在我看来,它可能会做你想要的.

同样,如果您将提供更多细节,我会向您展示更多答案.

此外,对于它的价值,您对帖子的编辑过于复杂.如果您打算以这种方式编写查询,那么它会更好:

SELECT
   S.StudentId,
   FinalScore = 
      Coalesce(
         (SELECT O.OverwrittenScore
         FROM dbo.OverwrittenScores O
         WHERE
            S.StudentId = O.StudentId
            AND O.AssignmentId = @assignmentId
         ), 
         (SELECT SomethingElse FROM SomewhereElse),
         0
      )
FROM dbo.Students S
Run Code Online (Sandbox Code Playgroud)

我还鼓励你在编写关联或连接时将另一个外部表放在连接中(S.StudentId = O.StudentId而不是O.StudentId = S.StudentId).我建议这样做是因为它可以帮助您更快地理解连接,因为您已经知道本地表并且想知道外部表,因此您的眼睛不必扫描到目前为止.我还建议在单独的行上放置多个条件.我保证,如果你养成这样做的习惯,你将来能够更快地理解自己的查询.