Ошибка в условии запроса: ORA-01427: подзапрос одиночной строки возвращает более одной строки
Таблица состоит из колонок: (note, note_owner).
Есть таблица работников с колонками: (empoyer_name, his_manager_name).
Необходимо прочитать из первой таблицы записи, которые принадлежат определённому менеджеру или его работникам.
Попытался вот так:
SELECT *
FROM fgac_table
WHERE note_owner = 'manager_1'
OR note_owner = (
SELECT empoyer_name
FROM employers_table
WHERE his_manager_name = 'manager_1');
Но ошибка:
ORA-01427: подзапрос одиночной строки возвращает более одной строки
Как нужно исправить запрос?
Ответы (2 шт):
Автор решения: Yitzhak Khabinsky
→ Ссылка
Предложение IN помогает в вашем случае.
SQL
SELECT* FROM fgac_table WHERE
note_owner = 'manager_1'
OR note_owner IN (SELECT empoyer_name FROM employers_table WHERE his_manager_name = 'manager_1');
Автор решения: 0xdb
→ Ссылка
Вот так по условию EXISTS с корреляционным подзапросом:
SELECT *
FROM fgac_table
WHERE note_owner = 'manager_1'
OR EXISTS (
SELECT 1
FROM employers_table
WHERE his_manager_name = 'manager_1' AND empoyer_name = note_owner);
Если с оператором IN, то лучше перенести условие OR в подзапрос:
SELECT *
FROM fgac_table
WHERE note_owner IN (
SELECT name
FROM (
SELECT empoyer_name name
FROM employers_table
WHERE his_manager_name = 'manager_1'
UNION ALL
SELECT 'manager_1' name FROM dual));
PS Возможные ошибки в дизайне таблиц:
- связь по
note_ownerиempoyer_nameне уникальна, могут быть тёзки однофамильцы, надо создать уникальный идентификатор записей - принято давать имена соответствующие тому, что они описывают: таблица работников должна называться employeеs, а то сейчас это - работодатели