SQL вставляет несколько строк с одним статическим значением, одним переменным - PullRequest
0 голосов
/ 07 июня 2019

У нас есть база данных со следующими настройками:

SiteSecurityID | SiteID | LoginName
---------------+--------+-----------
Auto Gen #       Number   Username

Теперь у нас есть 35 идентификаторов SiteID, и каждому пользователю необходим доступ к каждому из них.Я не могу получить запрос, который пытался сделать это успешно.

Я могу сделать это один за другим, используя этот метод, но должен быть более простой способ ...

INSERT INTO SiteSecurity (SiteID, LoginName) 
VALUES ('1', 'user1'), ('2', 'user1');

1 Ответ

1 голос
/ 07 июня 2019

Вы можете сгенерировать все строки, используя cross join, при условии, что у вас есть таблицы для сайтов и пользователей:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...