2013-05-15 3 views
0

아래의 참고는 결과가 다른 변수 인 다른 변수를 선언해야합니다. 이 작업을 수행하지 않으면 값을 필요로 할 때마다이 쿼리를 반복해야합니다.투영의 내부에 변수를 선언하십시오.

SELECT 키워드 안에 DECLARE을 쓰지 않도록 SQL Server에서 예외가 발생합니다. 나는 무엇을 할 수 있는가?

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. 당신은 간단한 문법으로 0NULL를 켭니다 IsNull 또는 Coalesce 기능을 사용할 수 있습니다.

  7. AB 대신 표를 참고하는 별칭을 사용하는 것이 좋습니다. 예를 들어 Students의 경우 S이고 OverwrittenScores의 경우 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 

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 

또한 (좋습니다 O.StudentId = S.StudentId 대신 S.StudentId = O.StudentId에서와 같이). 필자는 이미 로컬 테이블을 알고 있고 외부 테이블을 알고 싶기 때문에 조인을 더 빨리 이해할 수 있으므로 눈을 멀리 검사 할 필요가 없기 때문에이 방법을 제안합니다. 또한 여러 조건을 별도의 줄에 두는 것이 좋습니다. 나는 당신이 당신의 쿼리를 빨리 습득 할 수있게 될 것을 약속한다.

+0

답장을 보내 주셔서 감사합니다 ErikE, 내 업데이트 코드를 볼 수 있습니까? 그 안에는 그 가치를 평가하는 경우가 있습니다. 처음 두 쿼리는 같음입니다.이 것이 NULL이면 다른 쿼리에서 다른 값을 얻습니다. –

+0

최대한 많이 업데이트했습니다. 추가 도움이 필요하면 자세한 내용을 입력하십시오. 진지하게. 자세한 세부 사항! 당신은 개념적 도움을 요청하고 있지만 실제로 당신을 도울 수있는 충분한 개념을 제공하지는 않습니다! – ErikE

+0

너무 많이, 나는 정말로 나의 생각을 다른 언어로 표현하는 것이 복잡하다고 느낀다. 나는 당신의 첫 번째 코드를 사용했고, 정말로 내가 필요한 것입니다! 나는 무엇을 할 수 있는지에 대해 모른다. LEFT JOIN –

관련 문제