Где условия. ! = в двух полях - PullRequest
0 голосов
/ 07 февраля 2020

Этот запрос дает мне именно то, что я хочу, НО это нехорошо;)

select *
from sel, (
    select * from sel where ttype = 15) as dl15
where ttype = 16
and sel.code = dl15.code
and convert(varchar,dl15.vdate,0)+convert(varchar, dl15.vtime,0) !=
    convert(varchar,sel.vdate,0)+convert(varchar, sel.vtime,0)

возможно, кто-то может помочь мне преобразовать эти условия convert(varchar,dl15.vdate,0)+convert(varchar, dl15.vtime,0) != convert(varchar,sel.vdate,0)+convert(varchar, sel.vtime,0) в более правильную форму

подзапрос результат:

id          code    vdate               vtime
2000983484  3374347 Feb  1 2020 12:00AM Dec 30 1899  7:05PM

результат без последних условий

id          code    vdate               vtime
2000983885  3374347 Feb  6 2020 12:00AM Dec 30 1899  8:00AM
2000983485  3374347 Feb  1 2020 12:00AM Dec 30 1899  7:43PM
2000952328  3374347 Feb  1 2020 12:00AM Dec 30 1899  7:05PM

необходимый результат

id          code    vdate               vtime
2000983885  3374347 Feb  6 2020 12:00AM Dec 30 1899  8:00AM
2000983485  3374347 Feb  1 2020 12:00AM Dec 30 1899  7:43PM

Ответы [ 2 ]

1 голос
/ 08 февраля 2020

Допущения:

  • vdate/vtime относятся к типу datetime и включают (милли / микро) секунды, которые должны игнорироваться (отсюда convert(...,0))
  • все Разыскиваются столбцы из обеих таблиц

Идея одного запроса:

select s15.*,s16.*
from   sel s15
join   sel s16
on     s15.code  = s16.code
and    s15.ttype = 15
and    s16.ttype = 16
where (   convert(varchar,s15.vdate,0) != convert(varchar,s16.vdate,0)
       or convert(varchar,s15.vtime,0) != convert(varchar,s16.vtime,0)
      )

Вариант предложения where, поскольку smalldatetime с точностью до минуты (ie, smalldatetime не имеет секунд):

where (   convert(smalldatetime,s15.vdate) != convert(smalldatetime,s16.vdate)
       or convert(smalldatetime,s15.vtime) != convert(smalldatetime,s16.vtime)
      )

И если vdate/vtime имеет тип smalldatetime, тогда не нужно вызывать convert():

where (   s15.vdate != s16.vdate
       or s15.vtime != s16.vtime
      )
0 голосов
/ 07 февраля 2020

Это лучше:

select *
from sel
join (select * from sel where ttype = 15) as dl15
on sel.code = dl15.code
and  convert(varchar,dl15.vdate,0)+convert(varchar, dl15.vtime,0) !=
     convert(varchar,sel.vdate,0)+convert(varchar, sel.vtime,0)
where ttype = 16 -- here add an table alias sel or dl15
...