我将如何同时插入具有所有不同子查询值的同一行,几乎就像通过子查询进行迭代一样?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我将如何同时插入具有所有不同子查询值的同一行,几乎就像通过子查询进行迭代一样?相关的知识,希望对你有一定的参考价值。
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))
我的问题是,我不知道将employees表中的一部分雇员直接插入到消息表中的简单方法,例如:
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列插入值,因为“字段'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"))
Here is a demo显示该示例
但是您的错误子查询返回多于1行是由于表employees
中有两行,其列area
中的值为“ Maintenance”,如您在此小型演示中所看到的:click here to see what causes your error
现在您需要做的就是决定在这种情况下该怎么做。您是否要像这样插入最大值或最小值:
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))
这两个示例均有效,check it here,但要取决于您要插入的内容。
以上是关于我将如何同时插入具有所有不同子查询值的同一行,几乎就像通过子查询进行迭代一样?的主要内容,如果未能解决你的问题,请参考以下文章
如何提高 SQL Server 查询的性能以选择具有值的行不在子查询中的一次计数