2016-11-12 3 views
2

Im работает с базой данных H2 и хочет переместить некоторые данные. Для этого я создал следующий запрос:Скалярный подзапрос содержит более одной строки

UPDATE CUSTOMER 
SET EMAIL = SELECT service.EMAIL 
FROM CUSTOMER_SERVICE AS service 
INNER JOIN CUSTOMER AS customer ON service.ID = customer.CUSTOMER_SERVICE_ID; 

Когда я теперь выполнять его в консоли Н2 я получаю следующее сообщение об ошибке:

Scalar subquery contains more than one row; SQL statement: 

UPDATE CUSTOMER 
SET EMAIL = SELECT service.EMAIL 
FROM CUSTOMER_SERVICE AS service 
INNER JOIN CUSTOMER AS customer ON service.ID = customer.CUSTOMER_SERVICE_ID [90053-192] 90053/90053 (Hilfe) 

Что эта ошибка говорит мне,?

EDIT

То, что я хочу achiev с моим запросом:

На самом деле каждый CUSTOMER имеет CUSTOMER_SERVICE. И я просто хочу переместить COLUMN EMAIL с CUSTOMER_SERVICE в таблицу CUSTOMER. для этого я уже добавил почтовый столбец пользователю. Я надеялся, что смогу сделать это с моим запросом, но, очевидно, нет.

ответ

2

Ваш запрос синтаксически не действует (все подзапросы должны иметь круглые скобки вокруг них).

Что вам не хватает, это предложение о соотношении. Я считаю, что вы хотите:

UPDATE CUSTOMER c 
    SET EMAIL = (SELECT cs.EMAIL 
       FROM CUSTOMER_SERVICE s 
       WHERE s.ID = c.CUSTOMER_SERVICE_ID 
       ); 

Я не знаю, что это должно быть: [90053-192] 90053/90053 (Hilfe).

0

Ваш запрос выбора возвращает более одной строки. Если вы этого не хотите, тогда вам нужно сделать что-то вроде агрегата или LIMIT 1 или что-то подобное.

+0

Но я хочу, чтобы запрос taht выполнялся на каждого клиента, который у меня есть. – Mulgard

1

Ваш подзапрос для хотя бы одного из ваших клиентов имеет несколько адресов электронной почты.

Вы могли ... (Select top 1 serverice.email ... Или ... (Select max(serverice.email) ...

Update Customer Set EMail=B.Email 
From Customer A 
Join (Select ID,max(EMail) as EMail From CUSTOMER_SERVICE Group By ID) B 
    on (A.CUSTOMER_SERVICE_ID = B.ID) 
+0

@Mulgard Ошибка говорит иначе. Любые NULL? –

+0

@Mulgard BINGO! –

+0

@Mulgard Моим первым выбором был бы параметр max() –

Смежные вопросы