2012-03-07 3 views
0

내가 열 이름을 가지고 내 데이터베이스에서 하나 개의 테이블이 있습니다 buildNumber, 결과, versionStatus합니다. 'versionStatus가'하고 '결과'패스하고 versionStatus이 새로운을하고 결과가 입니다 ' 실패'어디 지금 내 SQL 문에 나는 'buildNumber'을 표시합니다. 그래서 나는 오늘 실패의 결과를 가지고 있지만 지난번에 통과 한 결과를 가진 것을 보여주고 싶습니다. 그래서 DB에 이러한 기록 (로 구분 된 열을 -)이있는 경우 :이 SQL 가입 방법 자체

build2--pass--old 
build2--fail--new 

는 "오래된"하지만 지금은 새로운 버전의 '실패'로 통과하기 때문에 SQL 문은 "build2"를 표시해야합니다.

select * 
from CSAResults.dbo.Details 
where result = 'pass' 
and versionStatus = 'Old' 
and versionStatus IN (select CSAResults.dbo.Details.versionStatus 
         from CSAResults.dbo.Details 
         where versionStatus = 'New' 
         and result = 'fail') 

을하지만 아무 것도 반환되지 않습니다 :

이 나는 ​​노력했다.

감사

답변

2

이 쿼리처럼 뭔가를 시도 주장하려고하지하고하는 것은 당신이 원하는 결과를 얻기 위해 정보 테이블의 자체 조인한다. 중복 결과를 얻을 수 없겠죠 그래서

을 통과했다 빌드의 여러 이전 버전이 있다면
SELECT distinct new.buildNumber 
FROM CSAResults.dbo.Details old 
JOIN CSAResults.dbo.Details new ON old.buildNumber = new.buildNumber 
WHERE old.result = 'pass' 
    AND old.versionStatus = 'Old' 
    AND new.result='fail' 
    AND new.versionStatus='New' 

나는 선택 절에 뚜렷한 추가
2

이 될하기 위해 IN 조건을 변경하는 경우 기존 쿼리가 작동합니다 : 또는

and buildNumber IN (select CSAResults.dbo.Details.buildNumber 

가 더 나은 성능의 쿼리가 될 수 있습니다

Select buildNumber 
from CSAResults.dbo.Details 
group by buildNumber 
having count(distinct case 
          when result = 'pass' and versionStatus = 'Old' then 1 
          when result = 'fail' and versionStatus = 'New' then 2 
         end) = 2 
0

대안이 될 것이다 INNER JOIN을 다음과 같이 사용하십시오.

select t.* 
from CSAResults.dbo.Details t INNER JOIN (SELECT t2.buildNumber 
            FROM CSAResults.dbo.Details t2 
            WHERE t2.versionStatus = 'New'       
            and t2.result = 'fail') t1 
           ON t.buildNumber = t1.buildNumber 
where t.result = 'pass' 
and t.versionStatus = 'Old' 
0

아무 것도 반환되지 않았습니까? 전혀 놀라운 : 당신이

(VersionStatus='New') = (VersionStatus='Old') 

이 대신

select * 
from CSAResults.dbo.Details 
where result = 'pass' 
and versionStatus = 'Old' 
and buildNumber IN (select CSAResults.dbo.Details.buildNumber       from CSAResults.dbo.Details 
      where versionStatus = 'New' 
      and result = 'fail')