Sql 在投影内声明一个变量
下面请注意,我需要声明一个变量,它是另一个查询的结果。如果不这样做,我需要在需要值的任何时候重复此查询 SQL Server正在抛出一个异常,该异常是关于不在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
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>不能在查询中间声明变量。
@
开头。游标变量可以是普通标识符,但这里您肯定不需要游标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,则从另一个查询获取另一个值,并尽可能地更新。如果您需要更多帮助,请提供更多详细信息。认真地更多细节!你要求概念上的帮助,但没有为我提供足够的概念来真正帮助你!非常感谢你,我真的觉得用另一种语言表达我的想法很复杂。我使用了你的第一个代码,这是我真正需要的!我不知道我还能做什么