如何在同一时间插入具有所有不同子查询值的同一行,就像在子查询上进行迭代一样


CREATE TABLE messages (messageid INTEGER PRIMARY KEY
, message VARCHAR(150)
, sender VARCHAR(40)
, recipient VARCHAR(40))
CREATE TABLE employees (employeeid INTEGER PRIMARY KEY
, employeename VARCHAR(40)
, area VARCHAR(40))

我的问题是,我不知道一种简单的方法可以将从员工表中选择的员工直接插入到消息表中,比如:

INSERT INTO messages (message
, sender
, recipient) 
VALUES ("Message."
, "System"
, (SELECT employeename 
FROM employees 
WHERE area = "Maintenance"))

这返回错误:Error Code: 1242. Subquery returns more than 1 row,我不确定如何从这里继续。

使用insert . . . select:

INSERT INTO messages (message, sender, recipient)
SELECT 'Message.', 'System', employeename
FROM employees
WHERE area = 'Maintenance';

请注意,不需要values关键字。我还将双引号替换为单引号,因为这是字符串的SQL标准分隔符。

即使将双引号改为单引号,也不能在不插入列messageid值的情况下插入表messages,因为"字段'messageid'没有默认值"。你需要这样做:

INSERT INTO messages (messageid
, message
, sender
, recipient) 
VALUES (1
, 'Message.'
, 'System'
, (SELECT employeename 
FROM employees 
WHERE area = 'Maintenance'))

这是一个小型演示

另一种选择是创建这样的表格消息:

CREATE TABLE messages (messageid INTEGER PRIMARY KEY AUTO_INCREMENT
, message VARCHAR(150)
, sender VARCHAR(40)
, recipient VARCHAR(40))

然后你的代码就可以工作了:

INSERT INTO messages (message
, sender
, recipient) 
VALUES ("Message."
, "System"
, (SELECT employeename 
FROM employees 
WHERE area = "Maintenance"))

这里有一个演示,向您展示的例子

但是您的错误Subquery返回超过1行是因为您的表employees中有两行area列中的值为"Maintenance",就像您在这个小演示中看到的那样:单击此处查看导致错误的原因

现在你需要做的是决定在这种情况下你会怎么做。您想从employees表中插入最大值还是最小值,如下所示:

INSERT INTO messages (message
, sender
, recipient) 
VALUES ("Message."
, "System"
, (SELECT max(employeename)
FROM employees 
WHERE area = "Maintenance"))

或者,你可能想在select语句中再添加一个条件,如下所示:

INSERT INTO messages (message
, sender
, recipient) 
VALUES ("Message."
, "System"
, (SELECT employeename
FROM employees 
WHERE area = "Maintenance"
and employeeid = 1))

这两个例子都有效,请在这里检查,但要插入什么内容取决于您。

最新更新