SQL Server:如果在其他表中满足要求,则将值插入到其他表中


DECLARE @AccountID VARCHAR(10)
SELECT @AccountID = AccountID
FROM MuOnlineSlow.dbo.T_VIPList 
WHERE Type = 1
INSERT INTO MUONLINEWEBS.dbo.MUONLINEWEBS_WEB_WAREHOUSE ([AccountID], [name_full], [name], [history], [hex], [cat], [itemid], [level], [luck], [skill], [excellent], [ancient], [time], [has_exe_1], [has_exe_2], [has_exe_4], [has_exe_8], [has_exe_16], [has_exe_32], [socket_exe_6], [socket_exe_7], [socket_exe_8], [server])
VALUES (@AccountID, 
'<span style="color:;font-family: tahoma;font-size: 12px;">Bundle of Jewel of Soul </span>', 
'Bundle of Jewel of Soul', 
'VIP REWARD',
'1F0000000000000000C000FFFFFFFFFF0001D560FFFFFFFFFFFFFFFFFFFFFFFF',
12, 31, 0, 0, 0, 0, 0,
1542466494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'DEFAULT')

问题是,查询只将在T_VIPList表中找到的最后一个信息插入到WEB_WAREHOUSE表中,但我有6行具有不同的AccountID。为什么它不在所有AccountIDWEB_WAREHOUSE中输入新信息?

有什么想法吗?

我想你想要更接近这一点的东西,它将从你的VIPList中选择所有类型1:的AccountID

INSERT INTO MUONLINEWEBS.dbo.MUONLINEWEBS_WEB_WAREHOUSE 
([AccountID], ..., [server]))
SELECT vip.AccountID, ..., 'DEFAULT'
FROM MuOnlineSlow.dbo.T_VIPList vip
WHERE vip.Type = 1;

而且,假设AccountID是您的主键,您可以通过检查是否存在来使插入更安全:

INSERT INTO MUONLINEWEBS.dbo.MUONLINEWEBS_WEB_WAREHOUSE 
([AccountID], ..., [server]))
SELECT vip.AccountID, ..., 'DEFAULT'
FROM MuOnlineSlow.dbo.T_VIPList vip
WHERE vip.Type = 1
AND NOT EXISTS(SELECT 1
FROM MUONLINEWEBS.dbo.MUONLINEWEBS_WEB_WAREHOUSE w
WHERE w.AccountID = vip.AccountID);

@AccountID是一个只能包含一个值的变量,而不能包含列表/数组/向量。因此,如果您想知道当带有WHERE的FROM返回6行,因此要为变量分配6个值时,为什么SELECT不抛出错误:因为这是SQL的不确定性行为之一。一个随机值"获胜",将从返回的6个值中分配。因此,您需要在没有变量的情况下将INSERT和SELECT结合起来,以获得其他答案所显示的所有行(=一个表(。

最新更新