SQL使用一个静态值和一个变量插入多行
我们的数据库具有以下设置:SQL使用一个静态值和一个变量插入多行,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我们的数据库具有以下设置: SiteSecurityID | SiteID | LoginName ---------------+--------+----------- Auto Gen # Number Username 现在,我们有35个SiteID,每个用户都需要访问每个SiteID。我无法获得任何查询,我已成功尝试执行此操作 我可以用这个方法一个接一个地做,但必须有一个更简单的方法 INSERT INTO SiteSecurity (SiteID, LoginNam
SiteSecurityID | SiteID | LoginName
---------------+--------+-----------
Auto Gen # Number Username
现在,我们有35个SiteID,每个用户都需要访问每个SiteID。我无法获得任何查询,我已成功尝试执行此操作
我可以用这个方法一个接一个地做,但必须有一个更简单的方法
INSERT INTO SiteSecurity (SiteID, LoginName)
VALUES ('1', 'user1'), ('2', 'user1');
您可以使用交叉联接生成所有行,前提是您有站点和用户的表:
INSERT INTO SiteSecurity (SiteID, LoginName)
SELECT s.SiteId, u.UserName
FROM Sites s CROSS JOIN
users u;
如果没有,您仍然可以动态生成它们。表构造函数因数据库而异,但这提供了一种方法:
INSERT INTO SiteSecurity (SiteID, LoginName)
SELECT s.SiteId, u.UserName
FROM (VALUES (1), (2), (3), . . . ) s(SiteID) CROSS JOIN
(VALUES ('user1'), ('user2'), . . . ) u(UserName);
编辑:
如果已有数据,则可以在插入之前过滤掉重复数据:
INSERT INTO SiteSecurity (SiteID, LoginName)
SELECT s.SiteId, u.UserName
FROM (VALUES (1), (2), (3), . . . ) s(SiteID) CROSS JOIN
(VALUES ('user1'), ('user2'), . . . ) u(UserName) LEFT JOIN
SiteSecurity ss
ON ss.SiteId = s.SiteId AND ss.LoginName = u.UserName
WHERE ss.SiteId IS NULL;
这些表格的程序简直是噩梦。我们正在将我们的用户与另一个集合合并,因此那里有现有数据。第二个解决方案有效!非常感谢你,戈登!OP的更多好处:保留对SiteSecurity表的联接,并将SiteSecurity.SiteID为NULL添加到WHERE,以确保不插入重复项,这可能是有益的