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关键字,但它没有成功
你不需要那么疯狂.你想要做的事情有很多概念上的问题.
您不能在查询中声明变量.
标量变量只能包含一个值.
SQL Server中的标量变量始终以@.游标变量可以是普通标识符,但你绝对不需要游标.
一个简单的JOIN将做你正在寻找的.子查询方法有效,但SELECT很难(在语句中坚持查询),不能提取多个列值,并且不能像查询一样在整个查询中重用JOIN.
您可以CASE直接在列上使用语句.没有必要首先尝试将值放入变量中.而这无论如何都行不通(见#2).
您可以使用IsNull或Coalesce函数将a NULL转换为0更简单的语法.
我鼓励你使用提示表而不是使用A和的别名B.例如,Sfor Students和Ofor 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).我建议这样做是因为它可以帮助您更快地理解连接,因为您已经知道本地表并且想知道外部表,因此您的眼睛不必扫描到目前为止.我还建议在单独的行上放置多个条件.我保证,如果你养成这样做的习惯,你将来能够更快地理解自己的查询.
| 归档时间: |
|
| 查看次数: |
135 次 |
| 最近记录: |