0

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

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

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

4

1 回答 1

7

你不需要那么疯狂。您正在尝试做的事情存在很多概念问题。

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

  2. 标量变量只能保存一个值。

  3. SQL Server 中的标量变量总是以@. 游标变量可以是普通的标识符,但你绝对不想要游标,在这里。

  4. 一个简单的JOIN将做你正在寻找的东西。子查询方法有效但很尴尬(在语句中粘贴查询SELECT),不能提取多个列值,并且不能像罐子一样在整个查询中重复使用JOIN

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

  6. 您可以使用IsNullorCoalesce函数将 aNULL转换为0具有更简单语法的 a。

  7. 我鼓励您使用暗示表格的别名,而不是使用Aand B。例如,SforStudentsOfor 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

更新

我在上面为你添加了另一个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

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

于 2013-05-15T18:25:50.940 回答