2012-03-07 67 views
0

我有我的数据库中有列名一个表:buildNumber结果versionStatus。现在在我的SQL语句,我想显示“buildNumber”,其中“versionStatus”是和“结果”是以及其中versionStatus是,其结果是“失败”。所以我想要显示任何因今天失败而导致上一次合格的结果。所以,如果我在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' 

我加了不同的SELECT子句中这样你就不会得到重复的结果,如果有迹象表明已经通过

构建的多个旧版本
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')