2013-05-15 72 views
0

注意下面,我需要聲明一個變量,這是另一個查詢的結果。如果不這樣做,我需要隨時在需要值的地方重複此查詢。聲明投影內的變量

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關鍵字,但它沒有成功

+1

也許,*只是可能*,如果您與我們分享了您想在子查詢中實現的邏輯類型,您可能*得到一些更好的幫助!根據我所知道的(荒謬的,我知道的)理論,我們不是讀心者,並且需要關於你想要完成的任務的信息,以便提出有用的建議。 – ErikE

+0

添加更多信息,閱讀對您的帖子的評論 –

回答

7

你不需要所有的瘋狂。你試圖做的事情有很多概念上的問題。

  1. 您不能在查詢中聲明變量。

  2. 標量變量只能保存一個值。

  3. SQL Server中的標量變量始終以@開頭。遊標變量可以是簡單的標識符,但您肯定不希望遊標在這裏。

  4. 一個簡單的JOIN將做你正在尋找。子查詢方法的工作原理很難但(在SELECT聲明中堅持查詢),不能拉多個列值,並且不能在整個查詢中重複使用,如JOIN可以。

  5. 您可以直接在列上使用CASE語句。沒有必要先嚐試將該值放入一個變量中。反正這也行不通(見#2)。

  6. 您可以使用IsNullCoalesce函數將NULL轉換爲0,並使用更簡單的語法。

  7. 我鼓勵您使用提示表而不是使用AB的別名。例如,SStudentsOOverwrittenScores

把所有這些點考慮,你可以做這樣的事情,而不是:

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 

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 

我也鼓勵你寫的相關性或者加入到把其他表先在加入時(如S.StudentId = O.StudentId而不是O.StudentId = S.StudentId)。我建議這樣做,因爲它可以幫助您更快地理解連接,因爲您已經知道本地表並想知道外部表,因此您的眼睛不必掃描得太遠。我還建議將多個條件放在不同的行上。我向你保證,如果你養成這樣做的習慣,你將能夠更快地理解你自己的問題。

+0

感謝您的回覆ErikE,你能看到我的更新代碼嗎?其中我有一個評估其價值的案例。前兩個查詢是相等的,如果這個是NULL,則從另一個查詢中獲得另一個值 –

+0

我儘可能地更新了它。如果您需要更多幫助,請提供更多詳細信息。認真。更多詳情!你在尋求概念上的幫助,但是沒有提供足夠的概念讓我真正能夠幫助你! – ErikE

+0

非常感謝你,我真的很難用另一種語言表達我的想法。我用你的第一個代碼,真的是我需要的!我不知道可以做什麼LEFT JOIN –