The error Operand should contain 1 column(s)
is most likely caused by a subquery that’s returning more than one column.
Here’s a typical SELECT
query that causes this error:
SELECT column_one,
(SELECT column_two, column_three FROM table_two)
FROM table_one;
The above subquery returns column_two
and column_three
, so MySQL throws the Operand should contain 1 column(s)
error.
Most often, you only need to check your subquery and make sure that it returns only one column.
If you need more guidance on how to fix this MySQL error, then you may read the next section.
How to fix Operand should contain 1 column(s) error
To illustrate an example, imagine you have two tables that have related data named members
and pets
.
The members
table contain the first_name
of people who have pets as shown below:
+----+------------+----------------+
| id | first_name | country |
+----+------------+----------------+
| 1 | Jessie | United States |
| 2 | Ann | Canada |
| 3 | Joe | Japan |
| 4 | Mark | United Kingdom |
| 5 | Peter | Canada |
+----+------------+----------------+
While the pets
table contain the owner
and the species
column as follows:
+----+--------+---------+------+
| id | owner | species | age |
+----+--------+---------+------+
| 1 | Jessie | bird | 2 |
| 2 | Ann | duck | 3 |
| 3 | Joe | horse | 4 |
| 4 | Mark | dog | 4 |
| 5 | Peter | dog | 5 |
+----+--------+---------+------+
The first_name
and the owner
columns are related, so you may use a subquery to display data from both tables like this:
SELECT `first_name` AS `owner_name`,
(SELECT `species`, `age`
FROM pets WHERE pets.owner = members.first_name)
FROM members;
However, the above SQL query is wrong, and it will throw an error like this:
ERROR 1241 (21000): Operand should contain 1 column(s)
This is because MySQL expects the subquery to return only one column, but the above subquery returns two.
To fix the error, you may create two subqueries with each subquery returning only one column as in the following SELECT
statement:
SELECT `first_name` AS `owner_name`,
(SELECT `species`
FROM pets WHERE pets.owner = members.first_name) AS `species`,
(SELECT `age`
FROM pets WHERE pets.owner = members.first_name) AS `age`
FROM members;
While the above query works, it will throw another error once the subquery returns more than one row.
Let’s add another pet that’s owned by “Jessie” to the pets
table as shown below:
+----+--------+---------+------+
| id | owner | species | age |
+----+--------+---------+------+
| 1 | Jessie | bird | 2 |
| 2 | Ann | duck | 3 |
| 3 | Joe | horse | 4 |
| 4 | Mark | dog | 4 |
| 5 | Peter | dog | 5 |
| 6 | Jessie | cat | 4 |
+----+--------+---------+------+
Now the subqueries will return two species
and age
rows for “Jessie”, causing another related error:
mysql> SELECT `first_name` AS `owner_name`,
-> (SELECT `species`
-> FROM pets WHERE pets.owner = members.first_name)
-> FROM members;
ERROR 1242 (21000): Subquery returns more than 1 row
To properly fix the error, you need to replace the subquery with a JOIN
clause:
SELECT `first_name` AS `owner_name`, `species`, `age`
FROM members JOIN pets
ON members.first_name = pets.owner;
Subqueries can be used to replace JOIN
clauses only when you need to SELECT
data from one table, but you need to filter the result by another table column.
For example, maybe you have some owner names in the pets
table that aren’t recorded in the members
table. You can use a subquery in the WHERE
clause to display rows in the pets
table that are also recorded in the members
table.
Here’s an example of using a subquery in the WHERE
clause:
SELECT `owner`, `species`, `age`
FROM pets
WHERE `owner` IN (SELECT `first_name` FROM members);
Without using a subquery, you need to JOIN the table as shown below:
SELECT `owner`, `species`, `age`
FROM pets JOIN members
ON pets.owner = members.first_name;
The two queries above will produce the same result set.
And that’s how you can fix the Operand should contain 1 column(s)
error in MySQL.
You need to check your subquery before anything else when you encounter this error.
Всем привет! Выходит это ошибка при вставке в таблицу данные.
Этот же код нормально работает для триггера Before Update, а для Before Insert выдает ошибку, типа много чем одной строки как я понял.
Вот мой код:
DROP TRIGGER IF EXISTS `InsertBuildingAnalysis`;
CREATE TRIGGER `InsertBuildingAnalysis` BEFORE INSERT ON `MDepartments` FOR EACH ROW BEGIN
DECLARE population INT;
DECLARE normative, isnornamtive INT;
DECLARE locality VARCHAR(1256);
DECLARE loc_dis_id int;
DECLARE loc_isCenter int;
DECLARE sub_pop int;
DECLARE sub_cpop int;
DECLARE dis_pop int;
SET population = (SELECT new_fnc(new.ParentId));
SET locality = (SELECT * FROM Localities WHERE Localities.Id = new.LocalityId);
SET loc_dis_id = (SELECT Localities.DistrictId FROM Localities WHERE Localities.Id = new.LocalityId);
SET loc_isCenter = (SELECT Localities.IsCenter from Localities WHERE Localities.Id = new.LocalityId);
SET sub_pop = (SELECT new_fnc2(new.SubRegionId));
SET sub_cpop = (SELECT new_fnc3(new.SubRegionId));
SET dis_pop = (SELECT new_fnc4(loc_dis_id));
IF (new.TypeId = 4 ) THEN
IF (population < 50) THEN
SET new.Normative = 0;
SET new.IsNormativePositive = 1;
ELSEIF (population > 8000) THEN
SET new.Normative = 0;
SET new.IsNormativePositive = 0;
ELSE
SET new.Normative = 1;
END IF;
ELSEIF (new.TypeId = 3) THEN
IF (population < 800) THEN
SET new.Normative = 1;
SET new.IsNormativePositive = 1;
ELSEIF (population > 2000) THEN
SET new.Normative = 0;
SET new.IsNormativePositive = 0;
ELSE
SET new.Normative = 1;
END IF ;
ELSEIF (new.TypeId = 2) THEN
IF (population > 800 && population <= 2000) THEN
SET new.Normative = 2;
ELSEIF (population > 2000 ) THEN
SET new.Normative = 1;
ELSE
SET new.Normative = 0;
SET new.IsNormativePositive = 1;
END IF;
ELSEIF (new.TypeId = 57) THEN
IF(population < 10000) THEN
SET new.Normative = 0;
SET new.IsNormativePositive = 1;
ELSE
SET new.Normative = 1;
END IF;
ELSEIF (new.TypeId = 26)THEN
IF (!locality) THEN
SET new.Normative = -1;
ELSEIF (loc_isCenter != 1) THEN
SET new.Normative = -2;
ELSE
SET new.Normative = 1;
END IF;
ELSEIF (new.TypeId = 35) THEN
SET population = sub_pop + sub_cpop;
IF(population >= 100000) THEN
SET new.Normative = 1;
ELSE
SET new.Normative = 0;
SET new.IsNormativePositive = 1;
END IF;
ELSEIF (new.TypeId = 27) THEN
SET population = dis_pop;
IF(population > 5000) THEN
SET new.Normative = 1;
ELSE
SET new.Normative = 0;
SET new.IsNormativePositive = 1;
END IF;
ELSEIF (new.TypeId = 25) THEN
SET new.Normative = 1;
END IF;
END;
Не знаю как исправить! Ваши варианты пож-а!
sql – MySQL error 1241: Operand should contain 1 column(s)
Syntax error, remove the ( )
from select
.
insert into table2 (name, subject, student_id, result)
select name, subject, student_id, result
from table1;
Just remove the (
and the )
on your SELECT statement:
insert into table2 (Name, Subject, student_id, result)
select Name, Subject, student_id, result
from table1;
sql – MySQL error 1241: Operand should contain 1 column(s)
Another way to make the parser raise the same exception is the following incorrect clause.
SELECT r.name
FROM roles r
WHERE id IN ( SELECT role_id ,
system_user_id
FROM role_members m
WHERE r.id = m.role_id
AND m.system_user_id = intIdSystemUser
)
The nested SELECT
statement in the IN
clause returns two columns, which the parser sees as operands, which is technically correct, since the id column matches values from but one column (role_id) in the result returned by the nested select statement, which is expected to return a list.
For sake of completeness, the correct syntax is as follows.
SELECT r.name
FROM roles r
WHERE id IN ( SELECT role_id
FROM role_members m
WHERE r.id = m.role_id
AND m.system_user_id = intIdSystemUser
)
The stored procedure of which this query is a portion not only parsed, but returned the expected result.
Related posts on MySQL Error :
- MySQL error code: 1175 during UPDATE in MySQL Workbench
- MySQL Error Operand should contain 1 column
- MySQL ERROR 1290 (HY000) –secure-file-priv option
- mysql error 1364 Field doesnt have a default values
- sql – MySQL Error 1264: out of range value for column
- sql – MySQL error: key specification without a key length
- mySQL Error 1040: Too Many Connection
- php – mysql error TYPE=MyISAM
5 ответов
Проблема заключается в том, что ваш внутренний запрос возвращает два столбца. Измените свой запрос, например
UPDATE ADRESSEN
SET EMAIL = 0
WHERE ID = (SELECT ID
FROM EIGENSCHAFTEN WHERE Kategorie = "BOUNCE"
GROUP BY ID
HAVING COUNT(ID) = 1)
Это должно сработать.
У меня есть еще одно предложение: вы уверены, что ваш внутренний запрос всегда будет возвращать одну строку?
Если вы хотите установить EMAIL со значением 0 для нескольких идентификаторов, возвращаемых внутренним запросом, я бы рекомендовал использовать «IN» вместо «=».
sak
14 март 2012, в 18:53
Поделиться
В вашем подзапросе содержатся два столбца. Попробуйте следующее:
UPDATE ADRESSEN
SET EMAIL = 0
WHERE ID = (SELECT ID
FROM EIGENSCHAFTEN WHERE Kategorie = "BOUNCE"
GROUP BY ID
HAVING COUNT(ID) = 1)
Я удалил COUNT(ID)
, поэтому вы выбираете только идентификатор и вместо этого помещаете его в предложение HAVING
.
Кроме того, если вы не уверены, что этот запрос никогда не вернет более одной строки, вам нужно иметь дело с возможностью дублирования. Либо измените на WHERE ID IN
вместо WHERE ID =
, либо ограничьте количество результатов, возвращаемых запросом. Метод ограничения результатов будет зависеть от ваших требований — добавление LIMIT 1
к подзапросу будет работать, но вы можете захотеть сделать некоторую сортировку или использовать MIN
/MAX
, чтобы указать, какую строку вы получите.
Ryan P
14 март 2012, в 18:36
Поделиться
Проблема с вашим подзапросом:
SELECT ID, COUNT(ID) AS COUNTER FROM EIGENSCHAFTEN WHERE Kategorie = "BOUNCE" GROUP BY ID HAVING COUNTER = 1
вы пытаетесь сравнить его с ID
, но возвращаете два столбца
James C
14 март 2012, в 18:47
Поделиться
UPDATE ADRESSEN
SET EMAIL = 0
WHERE ID = (SELECT ID
FROM EIGENSCHAFTEN WHERE Kategorie = "BOUNCE"
GROUP BY ID
HAVING COUNT(*) = 1)
Teja
14 март 2012, в 19:38
Поделиться
WHERE ID IN (SELECT ID
FROM EIGENSCHAFTEN
WHERE Kategorie = "BOUNCE"
GROUP BY ID
HAVING COUNT(*) = 1 )
DRapp
14 март 2012, в 18:44
Поделиться
Ещё вопросы
- 0curl возвращает старую версию страницы
- 1Мульти ребенок в MDI
- 1Сравнение списков и значений, которые существуют в одном, а не в другом
- 0как отобразить выбранные записи в порядке убывания по последнему идентификатору MySQL PHP
- 1Проблема в разборе JSON String
- 1Заполнить столбец с именем подпапки в Python?
- 0Пользовательские привязки Knockout и JQuery UI не распознают виджет при обновлении наблюдаемого массива
- 0freopen_s («conout $») и fclose
- 0Создать поддомен с помощью cpanel api
- 1Сделать вызов gen_server через Jinterface?
- 0Почему стили стилей id не работают для тега <a> в Safari?
- 0Использование GetElementsById для поиска веб-сайта
- 0добавить диаграмму с помощью highcharts в angular с помощью директивы highcharts-ng
- 1Unity не может разрешить зависимость InterfaceInterceptor
- 1Как переопределить параметры по умолчанию в объекте, переданном в функцию?
- 0jQuery .html получает только последнее значение JSON
- 1Как вы фокусируете эмулятор Android разработчика?
- 0JQuery проблемы с выбором параметров в HTML ()
- 0Как получить AngularJS Форма запроса после отправки запроса
- 0Сделать поиск в текстовом файле без учета регистра
- 0Меню CSS / панель навигации: центрированное изображение, ширина жидкости
- 0Почему EXISTS () всегда возвращает true?
- 0Где написать скрипт jQuery на странице ASP.NET?
- 0Как добавить флажки из базы данных в диалоговое окно Jquery UI
- 0вызов службы асинхронного отдыха с помощью jquery
- 1VueJs 2 скрыть и показать DIV на одной HTML-странице
- 0Обнаружение IE не работает
- 0Выпадающий список не обновляется сразу при изменении значения массива
- 1C # не может сравнить два datetime правильно
- 0Что, если вообще что-то делает здесь метод изменения jQuery?
- 1Этот сайт не может быть достигнут (ERR_CONNECTION_CLOSED) обнаружение JavaScript для window.open
- 1Элемент не активен, так как другой элемент скрывает его в python
- 1Какой правильный синтаксис для строк в LIKE, используя cx_Oracle?
- 064-битные и 32-битные инструменты работают в одной среде
- 0.click не будет щелкать при переходе в другие div
- 1Как отправлять сообщения асинхронно, чтобы поставить их в очередь, не ожидая ответа на каждое сообщение весной amqp, используя rabbitmq в java?
- 0Как запустить асинхронный метод независимо от предыдущего успеха или неудачи
- 0VB Script не будет работать в моем приложении HTA… только экран становится белым
- 0как использовать статический вектор внутри статической функции
- 0Как я могу убедиться, что нажатие на изображение перенаправит меня на мою домашнюю страницу?
- 1Как заставить индикатор выполнения использовать изображение, чтобы показать прогресс вместо использования цвета в Android
- 1Есть ли опасность принудительного добавления исключения во время выполнения в поток с Thread.stop (Throwable)?
- 1Spannable от Android
- 0Как найти функцию звонящего при нахождении в строгом режиме
- 1Как изменить параметр внутри объекта?
- 0Оператор присваивания
- 1Передача параметров из функции в другую функцию, где параметры имеют одинаковое имя в Python [closed]
- 1PInvoke DnsQueryEx Async
- 1Как использовать объектный отдых с дженериками в потоке?