당신은 그 모든 광란을 필요로하지 않습니다. 당신이하려는 일에 많은 개념적 문제가 있습니다.
쿼리 중간에 변수를 선언 할 수 없습니다.
스칼라 변수는 하나의 값만 가질 수 있습니다.
SQL Server의 스칼라 변수는 항상 @
으로 시작합니다. 커서 변수는 일반 식별자 일 수 있지만 여기에서는 커서를 사용하지 않습니다.
간단한 JOIN
은 당신이 찾고있는 것을 할 것입니다. 하위 쿼리 방법은 작동하지만 어색함 (SELECT
문에 쿼리가 고정되어 있음), 둘 이상의 열 값을 가져올 수 없으며 JOIN
처럼 쿼리 전체에서 다시 사용할 수 없습니다.
CASE
문을 열에 직접 사용할 수 있습니다. 먼저 값을 변수에 넣으려고 할 필요가 없습니다. 그리고 그것은 어쨌든 작동하지 않을 것입니다 (# 2 참조).
당신은 간단한 문법으로 0
에 NULL
를 켭니다 IsNull
또는 Coalesce
기능을 사용할 수 있습니다.
A
및 B
대신 표를 참고하는 별칭을 사용하는 것이 좋습니다. 예를 들어 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
에서와 같이). 필자는 이미 로컬 테이블을 알고 있고 외부 테이블을 알고 싶기 때문에 조인을 더 빨리 이해할 수 있으므로 눈을 멀리 검사 할 필요가 없기 때문에이 방법을 제안합니다. 또한 여러 조건을 별도의 줄에 두는 것이 좋습니다. 나는 당신이 당신의 쿼리를 빨리 습득 할 수있게 될 것을 약속한다.
어쩌면 * 아마도 어쩌면 *, 당신이 우리와 함께 어떤 종류의 논리를 하위 쿼리 내부에서 구현하고자한다면 아마도 좀 더 나은 도움을 얻을 수있을 것입니다. 우리가 마음에 그리는 독자가 아니며 유용한 제안을하기 위해 성취하려고하는 작업에 대한 정보가 필요하다는 (터무니없는, 나는 알고있다) 이론에 대해서. – ErikE
추가 정보, 게시물에 대한 설명을 읽으십시오 –