Рекурсивный INSERT-запрос для сгруппированной последовательности - PullRequest
4 голосов
/ 25 июля 2011

У меня есть две таблицы, подобные этой:

Table1ID               Table2ID    Table1ID  SomeDate
--------               ------------------------------
1                      1           1         2011-01-01
2                      2           1         2011-01-02
3                      3           2         2011-01-01
4                      4           3         2011-01-01
                       5           3         2011-01-02
                       6           3         2011-01-03
                       7           4         2011-01-01
                       8           4         2011-01-02

Мне нужно вставить значения в третью таблицу, которые дают мне оба значения из таблицы 2, а также значение «последовательности», сгруппированное по Table1ID. Я пробовал это, но я всегда получаю значение 1 для последовательности.

;WITH Sequences AS (
    SELECT t1.Table1ID,
           MAX(ISNULL(t3.Sequence, 0)) AS [MaxSequence]
    FROM Table1 t1
    LEFT JOIN Table3 t3 (NOLOCK) ON t1.Table1ID = t3.Table1ID
    GROUP BY t1.Table1ID
)
INSERT INTO Table3 ( Table1ID, Table2ID, Sequence )
SELECT t1.Table1ID,
       t2.Table2ID,
       s.MaxSequence + 1
FROM Table1 t1 (NOLOCK)
JOIN Table2 t2 (NOLOCK) ON t1.Table1ID = t2.Table2ID
JOIN Sequences s ON t2.Table1ID = s.Table1ID
ORDER BY t2.SomeDate

То, что я хочу, это набор результатов, подобный этому:

Table2ID    Table1ID  Sequence
------------------------------
1           1         1
2           1         2
3           2         1
4           3         1
5           3         2
6           3         3
7           4         1
8           4         2

Я знаю, что, возможно, здесь упускаю что-то глупо простое, но я застрял.

1 Ответ

4 голосов
/ 25 июля 2011
insert into Table3 (Table2ID, Table1ID, Sequence)
select
  Table2ID,
  Table1ID,
  row_number() over(partition by Table1ID order by Table2ID)
from Table2

Что тестировать:

declare @Table2 table
(
  Table2ID int identity,
  Table1ID int
)
insert into @Table2 values
(1),(1),
(2),
(3),(3),(3),
(4),(4)

declare @Table3 table
(
  Table2ID int, 
  Table1ID int, 
  Sequence int
)

insert into @Table3 (Table2ID, Table1ID, Sequence)
select
  Table2ID,
  Table1ID,
  row_number() over(partition by Table1ID order by Table2ID)
from @Table2

select *
from @Table3

Результат:

Table2ID    Table1ID    Sequence
----------- ----------- -----------
1           1           1
2           1           2
3           2           1
4           3           1
5           3           2
6           3           3
7           4           1
8           4           2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...