0

У меня есть две таблицы «основной» и «перемещенный». В «основной» таблице есть записи, из которых я перемещаю 3 строки последовательно в «перемещенную» таблицу, выполняя хранимую процедуру. Поэтому каждый раз, когда я выполняю хранимую процедуру, он должен проверять, чтобы следующий набор из трех строк последовательно считывался из «основной» таблицы из строки последнего перемещения и вставлен в «перемещенную» таблицу.Возьмите следующие N строк рекурсивно и последовательно из таблицы sql

select rowid from @main 
rowid 
----------------------- 
1 
2 
3 
4 
5 

Теперь, когда я выполнить запрос, он должен взять 3 строки из «основного» таблицы и вставить в «переехал» таблицы. Скажем, если я запустил запрос 5 раз, так я ожидаю, что таблица «перемещение» будет содержать каждый раз при запуске.

1,2,3 --"moved" table has these rows 1st time when I run the query 
4,5,1 --"moved" table has these rows 2nd time when I run the query 
2,3,4 --"moved" table has these rows 3rd time when I run the query 
5,1,2 --"moved" table has these rows 4th time when I run the query 
3,4,5 --"moved" table has these rows 5th time when I run the query 
1,2,3 --"moved" table has these rows 6th time when I run the query 

... поэтому последовательное чтение продолжается. Прочитайте последовательно из следующей строки, где она закончилась с последнего запуска.

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

Заранее за вашу помощь.

+1

Без предложения ORDER BY нет порядка, а _sequential_ не имеет значения. В каком столбце вы хотите указать порядок значений, которые должны быть взяты из '@ main'? (Кажется, что только один столбец, и вам не нравятся результаты, которые он предоставляет.) – HABO

+0

«Главная» таблица является базовой таблицей и имеет только один столбец «RowID». Таблица «Перемещена» - это целевая таблица, которая также имеет только один столбец «RowID». Я пытаюсь прочитать строки сверху вниз и начать с вершины снова, как только он достигнет конца таблицы - рекурсивный. Запрос может быть любым, пока я получаю данный вывод выше. В главной таблице есть только столбец «RowID». –

ответ

0
DECLARE @main TABLE 
(
    RowID INT IDENTITY(1,1), 
    DataID INT 
) 
DECLARE @selected TABLE 
(
    RowID INT IDENTITY(1,1), 
    DataID INT 
) 

DECLARE @final TABLE 
(
    RowID INT IDENTITY(1,1), 
    DataID INT 
) 

INSERT INTO @main values (1),(2),(3),(4),(5),(6),(7) 
--INSERT INTO @Selected values (1),(2),(3) 
--INSERT INTO @Selected values (4),(5),(6) 
--INSERT INTO @Selected values (7),(1),(2) 
--INSERT INTO @Selected values (3),(4),(5) 
INSERT INTO @Selected values (6),(7),(1) 
--INSERT INTO @Selected values (2),(3),(4) 
--INSERT INTO @Selected values (5),(6),(7) 
--INSERT INTO @Selected values (1),(2),(3) 

DECLARE 
    @LastDataID INT, 
    @FinalCount INT 

SELECT 
    TOP 1 
    @LastDataID = DataID 
FROM 
    @selected 
ORDER BY 
    RowID 
DESC 

INSERT INTO @final 
    SELECT 
     TOP 3 
     DataID 
    FROM 
     @main 
    WHERE 
     DataID > @LastDataID 

SELECT @FinalCount = COUNT(1) FROM @final 

IF (ISNULL(@FinalCount, 0) < 3) 
BEGIN 
    INSERT INTO @final 
     SELECT 
      TOP (3 - @FinalCount) 
      DataID 
     FROM 
      @main  
END 

SELECT * FROM @final 

Ключ должен был иметь ссылку на последнюю запись перешел в «переехал/выбранной» таблицы. Он работал, как ожидалось.

0

Следующий пример может дать вам отправную точку. Обратите внимание, что должен быть явным порядком, предусмотренным для значений, которые вы хотите вставить. Таблица не имеет естественного порядка, а «последовательный» не имеет смысла.

-- Sample data. 
declare @Template as Table (TemplateValue VarChar(10), TemplateRank Int); 
-- NB: TemplateRank values are assumed to start at zero and be dense. 
insert into @Template (TemplateValue, TemplateRank) values 
    ('one', 0), ('two', 1), ('three', 2), ('four', 3); 
declare @NumberOfTemplateValues Int = (select Max(TemplateRank) from @Template) + 1; 
select * from @Template; 

declare @AccumulatedStuff as Table (Id Int Identity, Value VarChar(10)); 
declare @GroupSize as Int = 5; 

-- Add a block of GroupSize rows to the AccumulatedStuff . 
declare @LastValue as VarChar(10) = (select top 1 Value from @AccumulatedStuff order by Id desc); 
declare @LastRank as Int = (select TemplateRank from @Template where TemplateValue = @LastValue); 
select @LastValue as LastValue, @LastRank as LastRank; 

with Numbers as (
    select 1 as Number 
    union all 
    select Number + 1 
    from Numbers 
    where Number < @GroupSize), 
    RankedValues as (
    select TemplateValue, TemplateRank 
     from @Template as T inner join 
     Numbers as N on (N.Number + Coalesce(@LastRank, @NumberOfTemplateValues - 1)) % @NumberOfTemplateValues = T.TemplateRank) 
    insert into @AccumulatedStuff 
    select TemplateValue from RankedValues; 

select * from @AccumulatedStuff; 

-- Repeat. 
set @LastValue = (select top 1 Value from @AccumulatedStuff order by Id desc); 
set @LastRank = (select TemplateRank from @Template where TemplateValue = @LastValue); 
select @LastValue as LastValue, @LastRank as LastRank; 

with Numbers as (
    select 1 as Number 
    union all 
    select Number + 1 
    from Numbers 
    where Number < @GroupSize), 
    RankedValues as (
    select TemplateValue, TemplateRank 
     from @Template as T inner join 
     Numbers as N on (N.Number + Coalesce(@LastRank, @NumberOfTemplateValues - 1)) % @NumberOfTemplateValues = T.TemplateRank) 
    insert into @AccumulatedStuff 
    select TemplateValue from RankedValues; 

select * from @AccumulatedStuff; 
+0

Спасибо за ваше время и код HABO! Действительно ценю это. Просто хотел, чтобы это было просто и не повторялось в явном цикле. Извините, я не мог четко объяснить свой вопрос в своем посте, иначе я уверен, что вы бы на это ответили. Выяснилось, отправил запрос ниже, если вы хотите понять, о чем я говорил выше. Извините за мое плохое объяснение. Проведя так много часов, я был довольно многообразным. Большое вам спасибо! –

Смежные вопросы