4

I have two tables like this:

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

I need to insert values into a third table that give me both values from Table2, as well as a "sequence" value grouped on Table1ID. I tried this, but I'm always getting a value of 1 for the sequence.

;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

What I want is a result-set like this:

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

I know I'm probably missing something stupidly simple here, but I'm stuck.

AJ.
  • 16,368
  • 20
  • 95
  • 150

1 Answers1

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

Something to test on:

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

Result:

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
Mikael Eriksson
  • 136,425
  • 22
  • 210
  • 281
  • 1
    *Smacks self on forehead* Of course! Forgot about ROW_NUMBER()...OVER. Thank you, works like a charm. – AJ. Jul 25 '11 at 17:31