Sql 在投影内声明一个变量

Sql 在投影内声明一个变量,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,下面请注意,我需要声明一个变量,它是另一个查询的结果。如果不这样做,我需要在需要值的任何时候重复此查询 SQL Server正在抛出一个异常,该异常是关于不在SELECT关键字内写入DECLARE。我能做什么?我错过了什么 SELECT A.StudentId, ( CASE WHEN (SELECT B.OverwrittenScore FROM dbo.OverwrittenScores AS B WHERE B.Student

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

SQL Server正在抛出一个异常,该异常是关于不在
SELECT
关键字内写入
DECLARE
。我能做什么?我错过了什么

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
在括号内,我需要实现一些逻辑,我的意思是可能实现另外两个查询。
我在想我是否可以在这里使用BEGIN关键字,但它没有成功

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

< L> > p>不能在查询中间声明变量。

  • 标量变量只能包含一个值

  • SQL Server中的标量变量始终以
    @
    开头。游标变量可以是普通标识符,但这里您肯定不需要游标

  • 一个简单的
    JOIN
    将满足您的需求。子查询方法可以工作,但很笨拙(将查询粘贴在
    SELECT
    语句中),不能提取多个列值,并且不能像
    JOIN
    一样在整个查询中重用

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

  • 您可以使用
    IsNull
    Coalesce
    函数将
    NULL
    转换为语法更简单的
    0

  • 我鼓励您使用提示表的别名,而不是使用
    A
    B
    。例如,
    S
    用于
    学生
    O
    用于
    核心

  • 考虑到所有这些因素,您可以这样做:

    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
    
    更新

    我在上面为您添加了另一个
    LEFT JOIN
    。您看到了在
    O.overwritenscore为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
    

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

    也许,只是也许,如果您与我们分享您希望在子查询中实现的逻辑,您可能会得到更好的帮助!关于(荒谬的,我知道)我们不是读心术者的理论,我们需要关于你试图完成的任务的信息,以便提出有用的建议。添加更多信息,阅读你帖子上的评论谢谢你的回复ErikE,你能看到我的更新代码吗?在这个例子中,我计算了它的值。前两个查询是相等的,如果这一个为NULL,则从另一个查询获取另一个值,并尽可能地更新。如果您需要更多帮助,请提供更多详细信息。认真地更多细节!你要求概念上的帮助,但没有为我提供足够的概念来真正帮助你!非常感谢你,我真的觉得用另一种语言表达我的想法很复杂。我使用了你的第一个代码,这是我真正需要的!我不知道我还能做什么