Как бы я вставил одну и ту же строку со всеми различными значениями подзапроса одновременно, почти как итерация над подзапросом? - PullRequest
2 голосов
/ 15 марта 2020
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 и я не уверен, что делать дальше.

Ответы [ 2 ]

0 голосов
/ 15 марта 2020

Нельзя вставить в таблицу messages без вставки значения для столбца 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"))

Вот демо , показывающее вам этот пример

Но ваша ошибка Подзапрос возвращает более 1 строка вызвана тем, что в вашей таблице есть две строки employees со значением "Maintenance" в столбце area, как вы можете видеть в этой небольшой демонстрационной версии: нажмите здесь, чтобы увидеть причину вашей ошибки

Теперь вам нужно решить, что вы будете делать в этой ситуации. Вы хотите вставить максимальное или минимальное значение из таблицы employees следующим образом:

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

Или, может быть, вы хотите добавить еще один критерий в оператор выбора, например:

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

Оба этих примера работают, отметьте здесь , но вам решать, что вы хотите вставить.

0 голосов
/ 15 марта 2020

Использование insert . . . select:

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

Обратите внимание, что ключевое слово values не требуется. Я также заменил двойные кавычки одинарными, потому что это стандартный разделитель SQL для строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...