SQL Copy Row用于列表,更改一个列值

时间:2009-11-19 17:32:02

标签: sql tsql insert

我需要复制一行几千次。我需要根据id列表从复制的行中更改一列。 伪代码:

INSERT INTO MyTable (TabID, Other Columns)
VALUES (TabID = (SELECT TabID FROM OtherTable WHERE ParentID = 1), Other Columns)

这可行吗?

6 个答案:

答案 0 :(得分:1)

INSERT
INTO    mytable
SELECT  othertable.tabid, mytable.othercolumn
FROM    mytable
CROSS JOIN
        othertable
WHERE   othertable.parentid = 1

这意味着parentid = 1中只有一条othertable的记录(否则您的子选择会失败)

答案 1 :(得分:1)

您是否有权使用SQL Server CLR?您可以使用常规循环在C#或VB中编写代码,并且非常方便地完成此操作。

如果没有CLR,您可以用几乎任何编码语言编写一个巨大的SQL字符串,并将其发送到数据库。这样,你可以使用通常的循环(for循环,do循环,foreach)。

答案 2 :(得分:1)

您想如何更改Tab1?如果你想增加它,为了争论,你可以这样做:

declare int @i
set @i = 0
while (@i < 1000)
begin
    INSERT INTO MyTable (TabID, col1, col2)
    SELECT TabID+1, col1, col2
    FROM OtherTable
    WHERE ParentID = 1 -- assuming only one row with that ID

    set @i = @i+1
end

更简洁,更简洁的方法是创建一个数字表(未经测试的代码):

DECLARE @numbers TABLE (n int)
declare int @i
set @i = 0
while (@i < 1000)
begin
    INSERT INTO @numbers (n) VALUES (i)
    set @i = @i+1
end

INSERT INTO MyTable (TabID, col1, col2)
SELECT TabID+1, col1, col2
FROM OtherTable
CROSS JOIN @numbers n
WHERE ParentID = 1 -- assuming only one row with that ID

答案 3 :(得分:0)

我会注意到在您的查询中使用GO语句,您可以执行GO 2000之类的操作,您的语句将执行2000次。您可以轻松插入2000行。这至少可以帮助您测试和规划您的解决方案。

示例:

CREATE TABLE #TableExample(thisid int IDENTITY(1,1) , thiscol varchar(1))

INSERT INTO #TableExample ( thiscol ) VALUES  ('x')
GO 2000 -- INSERT Statement will execute 2000 times.


DROP TABLE #TableExample

你能解释为什么你需要复制行以及它们将用于什么?如果您分享这些假设,您获得的反馈可能会导致更改这些假设并最终导致更好的解决方案。

答案 4 :(得分:0)

我必须用我的2个表解决类似的问题:UserUserCustomSetting。我希望每个用户都继承“默认”用户记录的设置。

我用一个简单的CROSS JOIN解决了。这是我的T-SQL查询

DECLARE @Username VARCHAR(100) = 'DefaultUser';

--get default UserID
DECLARE @UserID INT = (SELECT UserID FROM [User] WHERE [User].Username = @Username)

-- delete previous settings (except default user)
DELETE FROM UserCustomSetting WHERE UserCustomSetting.UserID <> @UserID

-- insert new settings for all users, copy them from the default user
INSERT INTO UserCustomSetting                               
SELECT u.UserID, ucs.SettingKey, ucs.Value
FROM [User] AS u
CROSS JOIN UserCustomSetting AS ucs 
WHERE ucs.UserID = @UserID
AND u.Username <> @Username

答案 5 :(得分:0)

交叉连接可能很难让你头脑发热。我在权限表上遇到了类似的问题。我想将用户FnMut的权限复制给新用户(10):

1

如果需要,您可以添加更多列。

UserID      ItemID     
1           CBE17 
1           184AB
1           459FA 
1           3856D
1           A261D