Ошибка SQL пробелов и островов

Попытка запустить запрос для определения начала и остановки пробелов и островов в моей таблице. Я применяю запрос, который, как я думаю, будет работать для моего набора данных, но я не могу выполнить его должным образом. Я получаю ошибку преобразования, когда запускаю этот код:

select start, stop 
from (
select m.API_WellNo + 1 as start,
    (select min(API_WellNo) - 1 
    from tblWellMaster x 
    where x.API_WellNo > m.API_WellNo) as stop
from tblWellMaster m    left outer join tblWellMaster r on m.API_WellNo = r.API_WellNo - 1
where r.API_WellNo is null
  ) as x
where stop is not null;

Вот ошибка, которую я получаю: Преобразование значения nvarchar '31003022850000' привело к переполнению столбца int.

Я не могу понять, откуда берется этот столбец int, потому что мой API_WellNo — это nvarchar(14)

Это число является одним из идентификаторов, составляющих последовательность, в которой я пытаюсь найти пробелы/острова, любая помощь очень ценится, спасибо


person Tom    schedule 17.12.2014    source источник
comment
Я думаю, что min преобразует API_WellNo из nvarchar в int. Указанное число слишком велико для столбца int.   -  person Robbert    schedule 17.12.2014
comment
m.API_WellNo + 1 и min(API_WellNo) - 1 вызывают неявное приведение к числовому типу   -  person Serpiton    schedule 17.12.2014
comment
Может быть, сделать преобразование MIN(CAST(API_WellNo AS BIGINT))   -  person Mihai    schedule 17.12.2014
comment
Какую базу данных вы используете? Вероятно, есть гораздо более эффективные решения этой проблемы.   -  person Gordon Linoff    schedule 17.12.2014


Ответы (1)


Попробуй это:

with cte as (
  select start = (cast(m.API_WellNo as bigint) + 1)
      , [stop] = ca.[stop]
    from tblWellMaster m    
      cross apply (
        select top 1 [stop]=(cast(x.API_WellNo as bigint) -1)
          from tblWellMaster x 
          where x.API_WellNo > m.API_WellNo
          order by x.API_WellNo
        ) as ca
    where not exists (
      select 1 
        from tblWellMaster r 
        where cast(m.API_WellNo as bigint)  = (cast(r.API_WellNo as bigint)  - 1))
  )
  select start, [stop] 
    from cte 
    where [stop] is not null;
person SqlZim    schedule 17.12.2014