Subquery returns more than 1 row?

Ошибка "Subquery returns more than 1 row" возникает в SQL, когда во вложенном запросе, также известном как субзапрос, возвращается более одной строки данных. Это происходит, когда условие, которое используется для фильтрации данных, не является достаточно точным или неудовлетворительным для получения только одного результата.

Предположим, у нас есть таблица "Orders" с информацией о заказах:

| order_id | customer_id | order_date |
| -------- | ----------- | ----------- |
| 1 | 101 | 2020-01-01 |
| 2 | 102 | 2020-01-02 |
| 3 | 102 | 2020-01-02 |

И таблица "Customers" с информацией о клиентах:

| customer_id | customer_name |
| ----------- | ------------- |
| 101 | John Smith |
| 102 | Jane Doe |

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

SELECT customer_id, customer_name
FROM Customers
WHERE customer_id IN (
  SELECT customer_id
  FROM Orders
  GROUP BY customer_id
  HAVING COUNT(*) > 1
);

Ожидаемый результат:

| customer_id | customer_name |
| ----------- | ------------- |
| 102 | Jane Doe |

Проблема возникает, когда вложенный запрос SELECT customer_id FROM Orders GROUP BY customer_id HAVING COUNT(*) > 1 возвращает несколько строк. Например, если бы в таблице "Orders" был еще один заказ, выполнение запроса привело бы к ошибке "Subquery returns more than 1 row". В следующем примере:

| order_id | customer_id | order_date |
| -------- | ----------- | ----------- |
| 1 | 101 | 2020-01-01 |
| 2 | 102 | 2020-01-02 |
| 3 | 102 | 2020-01-02 |
| 4 | 103 | 2020-01-03 |

То результатом запроса выше были бы две строки:

| customer_id | customer_name |
| ----------- | ------------- |
| 102 | Jane Doe |
| 103 | NULL |

Поскольку субзапрос возвращает две строки (customer_id 102 и 103), запрос не может быть выполнен, и возникает ошибка "Subquery returns more than 1 row". Для исправления этой ошибки необходимо уточнить условия вложенного запроса, чтобы он возвращал только одну строку данных. Например, мы можем исключить клиентов, которые имеют значение NULL в поле "customer_name", чтобы получить только активных клиентов:

SELECT customer_id, customer_name
FROM Customers
WHERE customer_id IN (
  SELECT customer_id
  FROM Orders
  WHERE customer_id IS NOT NULL
  GROUP BY customer_id
  HAVING COUNT(*) > 1
);

Ожидаемый результат:

| customer_id | customer_name |
| ----------- | ------------- |
| 102 | Jane Doe |

В этом случае, субзапрос SELECT customer_id FROM Orders WHERE customer_id IS NOT NULL GROUP BY customer_id HAVING COUNT(*) > 1 вернет только одну строку (customer_id 102), и запрос успешно выполнится без ошибок.

Таким образом, чтобы избежать ошибки "Subquery returns more than 1 row", вам необходимо уточнить условия вложенного запроса, чтобы он возвращал только одну строку данных, либо использовать другие методы фильтрации или агрегации данных.