我需要复制一行几千次。我需要根据id列表从复制的行中更改一列。 伪代码:
INSERT INTO MyTable (TabID, Other Columns)
VALUES (TabID = (SELECT TabID FROM OtherTable WHERE ParentID = 1), Other Columns)
这可行吗?
答案 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个表解决类似的问题:User
和UserCustomSetting
。我希望每个用户都继承“默认”用户记录的设置。
我用一个简单的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