2015-12-28 7 views
1

Я работаю над системой баз данных, которая использует синтаксис SQL. Однако я не могу использовать крест в коде ниже. Есть ли способ переписать это без применения?Изменение запроса SQL Server на чистый запрос ANSI SQL

declare @rsBuildDetails table(dt datetime, build varchar(255), val varchar(255)); 

insert into @rsBuildDetails (dt, build, val) 
values ('20100101', '1', 'pass') 
     ,('20100102', '2', 'fail') 
     ,('20100103', '3', 'pass') 
     ,('20100104', '4', 'fail') 
     ,('20100105', '5', 'fail') 
     ,('20100106', '6', 'fail') 
     ,('20100107', '7', 'pass') 
     ,('20100108', '8', 'pass') 
     ,('20100109', '9', 'pass') 
     ,('20100110', '10', 'fail'); 

with passed as 
(
    select * 
    from @rsBuildDetails 
    where val='pass' 
) 
select distinct 
    preFail.dt AS FailedDt, 
    postFail.dt AS SecondFailedDt 
from 
    passed 
cross apply 
    (select top 1 
     pre.* 
    from 
     @rsBuildDetails as pre 
    where 
     pre.dt < passed.dt 
     and pre.val = 'fail' 
    order by 
     pre.dt desc) as preFail 
cross apply 
    (select top 1 
     post.* 
    from 
     @rsBuildDetails as post 
    where 
     post.dt > passed.dt 
     and post.val = 'fail' 
    order by 
     post.dt asc) as postFail 
+0

Вы действительно хотите чистый запрос ANSI SQL, или вы хотите конкретную СУБД? –

+0

@ Тим, Шнуго смог ответить на мой вопрос ниже. Спасибо – jyim89

ответ

2

Вы могли бы попытаться передать КТР и все относится к встраиваемой суб-выбирает:

declare @rsBuildDetails table(dt datetime, build varchar(255), val varchar(255)); 

insert into @rsBuildDetails (dt, build, val) values 
('20100101', '1', 'pass') 
,('20100102', '2', 'fail') 
,('20100103', '3', 'pass') 
,('20100104', '4', 'fail') 
,('20100105', '5', 'fail') 
,('20100106', '6', 'fail') 
,('20100107', '7', 'pass') 
,('20100108', '8', 'pass') 
,('20100109', '9', 'pass') 
,('20100110', '10', 'fail'); 

select * 
from 
(
    select distinct 
      (
      select top 1 pre.Dt 
      from @rsBuildDetails as pre 
      where pre.dt<passed.dt 
       and pre.val='fail' 
      order by pre.dt desc 
      ) as FailedDt 
     ,(
      select top 1 post.Dt 
      from @rsBuildDetails as post 
      where post.dt>passed.dt 
       and post.val='fail' 
      order by post.dt asc 
     ) AS SecondFailedDt 
    from 
    (
     select * 
     from @rsBuildDetails 
     where val='pass' 
    ) AS passed 
) AS tbl 
where tbl.FailedDt IS NOT NULL 
    AND tbl.SecondFailedDt IS NOT NULL 
+0

Это прекрасно. Именно то, что я искал. Я приму ответ, как только это позволит мне. – jyim89

+0

@ jyim89 Спасибо, пожалуйста, прочитайте [это: кто-то-ответы] (http://stackoverflow.com/help/someone-answers). Я посетил ваш профиль и обнаружил, что вы очень редко принимаете ответы ... Это важно, чтобы показать другим пользователям, что этот вопрос решен (если он ...), и он даст некоторые точки репутации ответчику. Btw: Принятие и голосование - это два отдельных шага. Все ответчики очень благодарны, если вы делаете оба, THX! – Shnugo