如何自加入此SQL

如何自加入此SQL,sql,join,self,Sql,Join,Self,我的数据库中有一个表具有列名:buildNumber、result、versionStatus。现在在我的SQL语句中,我想显示'buildNumber',其中'versionStatus'是旧的,'result'是通过的,而versionStatus是新的,结果是失败的。所以我想显示今天失败但上次通过的结果。因此,如果我在DB中有这些记录(列之间用--)分隔): SQL语句应该只显示“build2”,因为它传递了“old”,但现在在新版本中“failed” 我试过: select * from

我的数据库中有一个表具有列名:buildNumberresultversionStatus。现在在我的SQL语句中,我想显示'buildNumber',其中'versionStatus'是旧的,'result'是通过的,而versionStatus是新的,结果是失败的。所以我想显示今天失败但上次通过的结果。因此,如果我在DB中有这些记录(列之间用--)分隔):

SQL语句应该只显示“build2”,因为它传递了“old”,但现在在新版本中“failed”

我试过:

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')
但是什么也没有归还


谢谢

如果您将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

如果将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

另一种方法是使用内部联接,如下所示:

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' 

另一种方法是使用内部联接,如下所示:

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' 

什么也没回来?不足为奇:你在试图断言

(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')

什么也没回来?不足为奇:你在试图断言

(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')

此查询执行详细信息表的自联接以获得所需的结果

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子句中添加了distinct,这样,如果有多个旧版本的构建已通过,您就不会得到重复的结果。此查询将执行一个自联接详细信息表以获得所需的结果

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子句中添加了distinct,这样,如果有多个旧版本的构建已经通过,您就不会得到重复的结果