oshirowanen
oshirowanen

Reputation: 15925

Copying existing rows in a table

How do I go about doing the following?

I am using the following query to get a specific users tab ids:

select id
from intranet.dbo.tabs
where cms_initials = @user
order by id asc

which might return the following ids

4
5
6
7

I now want to insert the rows from the following query:

select tabs_id, widgets_id, sort_column, sort_row
from intranet.dbo.columns c
inner join intranet.dbo.tabs t on c.tabs_id = t.id
where t.is_default = 1

But use the ids from the first query to replace the tab ids

so if the second query originally returns tabs_id's as

0
0
0
0
1
1
1
2
2
2
3
3

I should end up with

0
0
0
0
1
1
1
2
2
2
3
3
4
4
4
4
5
5
5
6
6
6
7
7

Is this possible with sql server 2005 without using stored procedures?

So far I have

insert into intranet.dbo.columns ( tabs_id, widgets_id, sort_column, sort_row )
select tabs_id, widgets_id, sort_column, sort_row
    from intranet.dbo.columns c
    inner join intranet.dbo.tabs t on c.tabs_id = t.id
    where t.is_default = 1

But this just copies everything as is, I need to do that, but replace the ids in the copied rows.

Upvotes: 1

Views: 119

Answers (1)

Anthony Faull
Anthony Faull

Reputation: 17957

This solution uses common table expressions and ranking functions. A and B are your original queries ranked by tab order. A and B are then joined by tab ranking and inserted.

USE intranet

;WITH A AS
(
    SELECT ROW_NUMBER() OVER (ORDER BY id) AS tab_ranking
        , id
    FROM dbo.tabs
    WHERE cms_initials = @user
),
B AS
(
    SELECT DENSE_RANK() OVER (ORDER BY tabs_id) AS tab_sequence
        , tabs_id, widgets_id, sort_column, sort_row
    FROM dbo.columns
    WHERE tabs_id IN (SELECT t.id FROM dbo.tabs t WHERE t.is_default = 1)
)
INSERT INTO dbo.columns (tabs_id, widgets_id, sort_column, sort_row)
SELECT a.id, b.widgets_id, b.sort_column, b.sort_row
FROM A
INNER JOIN B ON B.tab_ranking = A.tab_ranking

Upvotes: 1

Related Questions