使用in语句将多行插入sql

时间:2018-04-30 20:45:37

标签: sql

我正在尝试编写一个sql脚本来进行批量插入。我需要它将经理用户添加到经理的组中。我试着像这样写

INSERT INTO group_member (group_id, user_id) VALUES ((SELECT group_id FROM user_group WHERE group_name = 'Manager') , (SELECT user_id 
FROM user WHERE manager=1 and user_status = 1));

但我收到此错误

子查询返回超过1行

我理解错误,但不确定如何解决它,以便我不会错过任何用户。

当运行时,可能有0到多个经理,不确定这是否会产生影响。

sql版本:5.6.27

CREATE TABLE user_group(
    group_id INT(11) NOT NULL AUTO_INCREMENT,
    group_name VARCHAR(128) NULL DEFAULT NULL,
    PRIMARY KEY (group_id)
);

CREATE TABLE user (
    user_id INT(11) NOT NULL AUTO_INCREMENT,
    user_name VARCHAR(128) NULL DEFAULT NULL,
    manager INT(11) NOT NULL
    user_status INT(11) NOT NULL
    PRIMARY KEY (user_id)
);

CREATE TABLE group_member (
    group_id INT(11) NOT NULL,
    user_id INT(11) NOT NULL,
    PRIMARY KEY (group_id, user_id)
);

2 个答案:

答案 0 :(得分:1)

  

我需要它将经理用户添加到经理的小组

INSERT INTO group_member (group_id, user_id)
SELECT (SELECT group_id FROM `group` WHERE group_name = 'Manager'),
       user_id 
FROM user WHERE manager=1 and user_status = 1;

当然,必须只有一个名为 Manager 的组。

测试

mysql> SELECT * FROM `user`;
+---------+-------------+---------+
| manager | user_status | user_id |
+---------+-------------+---------+
|       1 |           1 |       1 |
|       1 |           1 |       2 |
+---------+-------------+---------+
2 rows in set (0.00 sec)

mysql> SELECT * FROM `group`;
+----------+------------+
| group_id | group_name |
+----------+------------+
|       17 | Manager    |
+----------+------------+
1 row in set (0.00 sec)

mysql> INSERT INTO group_member (group_id, user_id)
    ->     SELECT (SELECT group_id FROM `group` WHERE group_name = 'Manager'),
    ->            user_id
    ->     FROM user WHERE manager=1 and user_status = 1;
Query OK, 2 rows affected (0.08 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * FROM group_member;
+----------+---------+
| group_id | user_id |
+----------+---------+
|       17 |       1 |
|       17 |       2 |
+----------+---------+
2 rows in set (0.00 sec)

答案 1 :(得分:1)

您想要insert . . . select

INSERT INTO group_member (group_id, user_id)
    SELECT g.group_id, u.user_id
    FROM (SELECT group_id FROM user_group WHERE group_name = 'Manager') g CROSS JOIN
         (SELECT user_id FROM user WHERE manager = 1 and user_status = 1) u;

如果该群组已有成员,您可能需要将其过滤掉。

您也可以将其写为:

INSERT INTO group_member (group_id, user_id)
    SELECT g.group_id, u.user_id
    FROM user u JOIN
         user_group g
         ON g.group_name = 'Manager' AND
            (u.manager = 1 and u.user_status = 1);