Как мы используем значение разницы 2 столбцов для запроса TOP в sql

Я хочу сгенерировать N строк из таблицы A, где N - разница между столбцом2 и столбцом1 из таблицы A для всех записей в таблице.

Я не хочу использовать циклы для этого.

Пример запроса

Select TOP (tbl1.Column2 - tbl1.Column1) tbl1.Column3, tbl2.Column1 
from TableA tbl1 cross join
     TableB tbl2
where tbl1.ID= 10

но это дает мне ошибку ниже

Ссылка на столбец «Столбец2» не допускается в аргументе предложения TOP, OFFSET или FETCH. Здесь разрешены только ссылки на столбцы во внешней области или автономные выражения и подзапросы.

Какова альтернатива, чтобы сделать это?


person Nishant Bhuskade    schedule 29.05.2017    source источник


Ответы (3)


Обычно вы должны использовать TOP с ORDER BY.

В любом случае вы можете делать то, что хотите, используя оконные функции:

select column3, column1
from (select (tbl1.Column2 - tbl1.Column1) as numrows,
             tbl1.Column3, tbl2.Column1,
             row_number() over (order by (select null)) as seqnum 
      from TableA tbl1 cross join
           TableB tbl2
      where tbl1.ID = 10
     ) t
where seqnum <= numrows;
person Gordon Linoff    schedule 29.05.2017

Вы можете попробовать переместить разницу в подзапрос, а затем выбрать из него верхнюю часть:

Select TOP DiffColumn, Column3, Column1
From (Select (tbl1.Column2 - tbl1.Column1) as DiffColumn, tbl1.Column3, tbl2.Column1 
from TableA tbl1 cross join
 TableB tbl2
where tbl1.ID= 10)

Кроме того, вам не хватало запятой перед tbl1.Column3 в исходном запросе.

person SandPiper    schedule 29.05.2017

Я хочу сгенерировать N строк из таблицы A. где N - разница столбца2-столбца1 от

Говоря, что N=diff. col1 и col2 неверно. Потому что он снова возвращает много строк. вы должны быть очень конкретными. как max(col2)-max(col1).т.е. объясните, как рассчитать разницу между col1 и col1.

Declare @diff int=10
declare @t table(col1 int)
insert into @t VALUES(1)
select * from @t A
cross apply(select distinct number from master..spt_values where  number>0 and  number<=@diff)ca

or

select top (@diff)* from @t A
person KumarHarsh    schedule 29.05.2017