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