复制表中的现有行

时间:2011-06-17 14:08:43

标签: sql sql-server sql-server-2005 tsql

如何进行以下操作?

我使用以下查询来获取特定用户标签ID:

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

可能会返回以下ID

4
5
6
7

我现在想要插入以下查询中的行:

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

但是使用第一个查询中的ID来替换选项卡ID

所以,如果第二个查询最初将tabs_id作为

返回
0
0
0
0
1
1
1
2
2
2
3
3

我最终应该

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

sql server 2005是否可以不使用存储过程?

到目前为止我已经

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

但这只是按原样复制所有内容,我需要这样做,但要替换复制行中的ID。

1 个答案:

答案 0 :(得分:1)

此解决方案使用common table expressionsranking functions。 A和B是按标签顺序排列的原始查询。然后按标签排名加入A和B并插入。

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