2009-11-30 7 views
0

다음 두 SQL 문을 하나로 결합해야합니다. 어떤 도움이라도 대단히 감사합니다.2 개의 TSQL 문을 1로 결합

감사합니다.

SELECT C.* 
,   M.members_Email 
,   (SELECT COUNT(*) 
      FROM tbl_CampaignRecipients 
      WHERE recip_CampaignId = C.campaign_Key 
      AND recipient_Status = 3 or recipient_Status = 4) as RecipientCount 
FROM  tbl_Campaigns C 
JOIN  tbl_Members M 
ON  C.campaign_MemberId = M.members_Id 
WHERE  C.campaign_MemberId = @userID 
ORDER BY C.campaign_Key DESC 

답변

1

에 존재하지 않는 경우에도 문 하나의 결과를 반환해야 하위 쿼리가 느리게 실행되는 경우 가능한 메서드 :

SELECT 
    C.column_1, 
    C.column_2, 
    ... 
    M.members_email, 
    SQ.recipient_count 
FROM 
    Campaigns C 
INNER JOIN Members M ON 
    M.members_id = @user_id 
LEFT OUTER JOIN 
(
    SELECT 
      CR.campaign_id, 
      COUNT(*) AS recipient_count 
    FROM 
      Campaign_Recipients CR 
    GROUP BY 
      CR.campaign_id 
) AS SQ ON 
    SQ.campaign_id = C.campaign_id 
WHERE 
    C.campaign_member_id = @user_id 
+0

Andomar을 내부 문장의 결과를 갖는 결과. – Munklefish

+0

@Munklefish : 캠페인이 없으면 캠페인 수신자가 없을 수 있습니다. 어쨌든, 당신은 어떤 행 집합 (들) 당신이 그 경우에 반환하고자하는 설명하기 위해 질문을 편집 할 수 있습니까? – Andomar

+0

Andomar, 내부 문장의 결과가 없으면 다른 (외부) 문장의 모든 데이터가 여전히 필요합니다 (예 : recipient_Status is not 3 또는 4). – Munklefish

0
SELECT C.*, M.members_Email, (SELECT ... insert 2nd SQL here ...) 
    FROM tbl_campaigns C ... rest of 1st SQL here ... 
1

또 다른 :

SELECT C.*, M.members_Email 
FROM tbl_Campaigns C 
JOIN tbl_Members M 
ON C.campaign_MemberId = M.members_Id 
WHERE C.campaign_MemberId = @userID 
ORDER BY C.campaign_Key DESC 


SELECT COUNT(*) FROM tbl_CampaignRecipients 
WHERE recip_CampaignId = C.campaign_Key AND 
(recipient_Status = 3 or recipient_Status = 4) 

그러나, 나는 어떤 결과가 당신이 좋아하는 하위 쿼리를 사용할 수있는 문 2

0

다른 방법

SELECT C.*, M.members_Email,(SELECT COUNT(*) FROM tbl_CampaignRecipients 
WHERE recip_CampaignId = C.campaign_Key AND 
recipient_Status in(3,4)) as TheCount 
FROM tbl_Campaigns C 
JOIN tbl_Members M 
ON C.campaign_MemberId = M.members_Id 
WHERE C.campaign_MemberId = @userID 
ORDER BY C.campaign_Key DESC 

예를

create table test (id int, id2 int) 
insert test values(1,1) 
insert test values(1,2) 
insert test values(1,3) 
insert test values(2,1) 
insert test values(2,1) 

select *,(select count(*) from test where id = t1.id) as the_count 
from test t1 
+0

실행하려고하면 첫 번째 쿼리의 테이블 별칭 "C"가 바인딩되지 않으므로 오류가 발생합니다. 개수는 단일 값이 아니며 각 행의 캠페인에 따라 다릅니다. –

+0

당신은 where 절의 그 부분을 놓치고 있습니다 .-( – SQLMenace

+0

코드를 업데이트하고 어떻게 작동하는지 예제를 추가하십시오. – SQLMenace

0

하나의 가능한 솔루션

SELECT C.*, M.members_Email, count(CR.recip_CampaignId) as CampaignCount 
FROM tbl_Campaigns 
    JOIN tbl_Members ON C.campaign_MemberId = M.members_Id 
    LEFT JOIN tbl_CampaignRecipients CR on CR.recip_CampaignId = C.campaign_Key 
     AND (CR.recipient_Status = 3 or CR.recipient_Status = 4) 
WHERE C.campaign_MemberId = @user 
ORDER BY C.campaign_Key DESC 
3

왜 하나에 두 문장을 결합해야합니까? 그러나이를 수행하면 결과 집합의 크기가 불필요하게 네트워크를 통해 전달됩니다.

내가 대신 저장 프로 시저에 두 문장을 결합하는 것이 좋습니다 : 클라이언트 측 코드에서

CREATE PROCEDURE GetAllData (@NumberOfRecipients int output) AS BEGIN 

SELECT C.*, M.members_Email 
FROM tbl_Campaigns C 
JOIN tbl_Members M ON C.campaign_MemberId = M.members_Id 
WHERE C.campaign_MemberId = @userID 
ORDER BY C.campaign_Key DESC 

SELECT @NumberOfRecipients = COUNT(*) 
FROM tbl_CampaignRecipients 
WHERE recip_CampaignId = C.campaign_Key 
AND (recipient_Status = 3 or recipient_Status = 4) 

END 

을, 당신은 이런 식으로 부를 것이다 :

  1. GetAllData에 대한 명령 객체를 생성 저장 프로 시저.
  2. @NumberOfRecipients 매개 변수에 대한 매개 변수 개체를 연결하십시오.
  3. 명령을 실행하십시오.
  4. 기본 결과 집합을 사용합니다.
  5. @NumberOfRecipients 매개 변수 값을 읽습니다 (결과 집합을 사용한 후에이 이어야 함).

C# 예제 :

using(SqlCommand command = new SqlCommand("GetAllData", connection)) { 
    command.CommandType = CommandType.StoredProcedure; 
    SqlParameter recipientsParam = new SqlParameter("@NumberOfRecipients", SqlDbType.Int) { Direction = ParameterDirection.Output }; 
    command.Parameters.Add(recipientsParam); 
    using(SqlDataReader reader = command.ExecuteReader()) { 
     // consume the resultset 
    } 
    // read the parameter 
    int recipients = (int) recipientsParam.Value; 
} 

할 수도 다시 사용하는 서버 측 T-SQL 코드에서 저장 프로 시저, 예를 들면 : 위해 일에만 나타납니다 것을

declare @NumberOfRecipients int 
insert into #Results execute GetAllData @NumberOfRecipients output 
+0

기독교인, 저는 개인적인 진술보다는 진술을 병합하는 것이 더 나은 형태라고 생각했습니다. ? Ps 사용하여 .Net 및 Sql2005 – Munklefish

+0

당신이 어디에서 아이디어를 가지고 있는지 모르겠다. 귀하의 예제에서 두 번째 문을 스칼라 값을 반환하는 것입니다. 항상 스칼라 값 복사본을 반환하는 것이 더 효율적입니다. 코드를 호출하여 결과 세트에 넣고 각 행에 대해 동일한 값을 반복해서 반환하십시오. –

관련 문제