我将如何同时插入具有所有不同子查询值的同一行,几乎就像通过子查询进行迭代一样?

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'))

Here is a small demo

其他选项是这样创建表格消息:

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 查询的性能以选择具有值的行不在子查询中的一次计数

SQL查询以选择在同一列中具有不同值的子记录的父级

比较两个日期分区上的同一行

如何在 postgres 中创建表并插入具有动态值的数据

如何查询 Prometheus 中所有具有特定标签值的时间序列?

如何在 SwiftUI 的同一行中使用粗体和普通文本