SQL Server:如果满足其他表中的要求,则插入另一个表中的值

时间:2018-11-21 20:58:50

标签: 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。为什么不将所有WEB_WAREHOUSE都输入到AccountID中呢?

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我认为您想要更进一步,它将从类型1的VIPList中选择所有帐户ID:

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);

答案 1 :(得分:0)

@AccountID是一个变量,只能保存一个值,而不能包含列表/数组/向量。因此,如果您想知道为什么带WHERE的FROM返回6行并因此将6个值分配给变量时SELECT不会引发错误:因为这是SQL的不确定行为之一。随机值“ wins”,将从返回的6中分配。因此,您需要将INSERT与SELECT结合起来使用而没有变量,以将所有行(=表)作为其他答案显示。