Как самостоятельно присоединиться к этому SQL - PullRequest
0 голосов
/ 07 марта 2012

В моей базе данных есть одна таблица с именами столбцов: buildNumber , результат , versionStatus .Теперь в своем операторе SQL я хочу отобразить «buildNumber», где «versionStatus» равен old , а «result» равен pass и где versionStatus равно new и результат 'fail '.Поэтому я хочу отобразить все, что имеет результат сбоя сегодня, но имеет результат прохода в прошлый раз.Поэтому, если у меня есть эти записи в БД (столбец, разделенный -):

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

, но ничего не возвращается.

Спасибо

Ответы [ 4 ]

2 голосов
/ 07 марта 2012

Этот запрос выполняет самосоединение таблицы Details, чтобы получить желаемый результат.

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 голосов
/ 07 марта 2012

Ваш существующий запрос должен работать, если вы измените условие 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 голосов
/ 07 марта 2012

ничего не возвращено?Вряд ли удивительно: вы пытаетесь утверждать

(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')
0 голосов
/ 07 марта 2012

В качестве альтернативы можно использовать 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' 
...