2014-03-03 1 views
0

두 개의 SQL 쿼리가 있습니다. 처음에는 총 점수를 획득하고 다른 점수에서는 최대 점수를 반환합니다. 이제는 단일 쿼리로 둘 다 결합하여 단일 프로 시저로 만들려고합니다.두 개의 다른 무관 한 SQL 쿼리 (단일 열 결과 반환)를 하나의 쿼리 결과로 결합합니다.

Select SUM(Marks) as MaxMarks from tbQuestions where ExamID =2 

내가 다시 보려면 아래 같은 것을 원하는

첫 번째 쿼리

select SUM(MarksObtained) as MarksObtained from tbAnswers where QID IN(Select QID from tbQuestions where ExamID =2) 

2 검색어 : 같은 쿼리는

Maxmarks | MarksObtained 
------------------------ 
    100  50 

내가 연합을 시도하지만,이 같은 것을 반환 아래 :

MarksObtained 
------------- 
100 

50 
+0

을 CTE를 사용 : 여러 쿼리를 결합하고 함께 그들 모두를 읽을 수있는 방법을 한게 –

+1

글쎄, 실제로는 testId를 하나만 사용하지 않고있다. 테스트 케이스 일 뿐이다. 하지만 한 번에 하나의 examID 만 필요하기 때문에 나에게 잘 작동합니다. 나는 실제로 저장 프로 시저에서 매개 변수로 examID를 부여하고 있습니다. –

답변

3

는 음, 쿼리 관련이 있기 때문에, 당신은 단지 선택에 던져 수 있습니다

SELECT 
    (
     select SUM(MarksObtained) 
     from tbAnswers where QID IN (
      Select QID from tbQuestions where ExamID = 2 
    ) 
    ) as MarksObtained, 
    (
     Select SUM(Marks) 
     from tbQuestions where ExamID = 2 
    ) as MaxMarks 
에도 허용 대답에
+0

글쎄, 정확하게 동일하게 작동 했으므로 이제는 여기에서 ur 도움말을 보았습니다. 여전히 고마워요 –

+0

우리가 각각의 외부에 동일한 것을 넣고 있기 때문에 별칭을 각 SQL 쿼리 안에 넣을 필요는 없지만 당신의 대답은 완벽합니다. –

0
;WITH CTE1 (MarksObtained) 
       AS (SELECT SUM(MarksObtained) AS MarksObtained 
        FROM  tbAnswers 
        WHERE QID IN (SELECT QID 
            FROM tbQuestions 
            WHERE ExamID = 2) 
       ), 
      CTE2 (MaxMarks) 
       AS (SELECT SUM(Marks) AS MaxMarks 
        FROM  tbQuestions 
        WHERE ExamID = 2 
       ) 
     SELECT MaxMarks,MarksObtained 
     FROM CTE1 , 
       CTE2 
1

이 할 수있는 그 아마 옳은 일을 언급하는 것은 의미가되는 것입니다 성능이 문제가되는 경우 별도의 쿼리를 그대로 사용하고 클라이언트에서 MARS를 사용하십시오.

는 업데이트 : 당신은 쉽게 단지 하나의 ExamID을 GROUPBY ExamID을 결과를 얻을 수있는 쿼리를 업데이트 할 수없고,

using(var conn = SqlConnection(...)) { 
    conn.Open(); 
    var cmd = conn.CreateCommand() 
    cmd.CommandText = 
    @"Select SUM(MarksObtained) as MarksObtained 
     from tbAnswers 
     where QID IN(Select QID from tbQuestions where ExamID =2);" 
    + @"Select SUM(Marks) as MaxMarks 
     from tbQuestions 
     where ExamID =2"; 

    using (var dr = cmd.ExecuteReader) { 
     ... // read MarksObtained 
     dr.NextResult() 
     ... // readMaxMarks 
     dr.Close() 
    } 
    conn.Close() 
} 

MSDN IDataReader.NextResult

+0

글쎄, 내 scenerio에는 실제로 두 가지 다른 프로 시저를 호출 할 필요가 없으므로 성능을 향상 시키려고합니다. 2 개의 다른 쿼리 대신 하나의 프로 시저만으로 충분하므로 프로그래밍 및 변수 측면에서 선언해야합니다. 공간 및 시간면에서 저를 잘 보존합니다. 아직도 당신이 어떤 상황에서 그것을 실제로 실행하는지 이해하기가 어렵습니다. –