针对分组序列的递归INSERT查询

时间:2011-07-25 17:15:10

标签: sql-server tsql recursive-query

我有两张这样的表:

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 个答案:

答案 0 :(得分:4)

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