2015-06-13 3 views
0

У меня есть две таблицы, CHEF и MEAL. То, что я пытаюсь сделать, - снизить зарплату каждого шеф-повара, который еще не сделал ни одной еды. Это мой запросSQL two table Однострочный подзапрос возвращает более одной строки

UPDATE CHEF 
SET Chef_salary = Chef_salary-(Chef_salary/100 * 5) 
WHERE Chef_ID=(SELECT c.Chef_ID 
FROM CHEF c LEFT JOIN MEAL m ON (c.Chef_ID=m.Chef_ID) 
HAVING count(m.Chef_ID)='0' 
GROUP BY c.Chef_ID);; 

возвращает ошибку, когда он говорит, что «однорядные подзапрос возвращает более одной строки» Что я делаю неправильно?

+0

Внутренний подзапрос 'ВЫБРАТЬ c.Chef_ID ОТ ШЕФ гр LEFT JOIN блюду м ON (с .Chef_ID = m.Chef_ID) HAVING count (m.Chef_ID) = '0' GROUP BY c.Chef_ID' возвращает более одной строки. Он должен возвращать только одну строку, если вы хотите запустить весь запрос на обновление. Так запустите автономный подзапрос, вы обнаружите, что более одного результата возвращаются. – user1

+0

SET Chef_salary = Chef_salary * 0.95 может дать вам тот же результат, меньше вычислений, предполагая, что сокращение на 5% - это то, что вы ищете – JamieD77

+0

Не нужно объединяться в две таблицы. Обновить CHEF c Set Chef_salary = Chef_salary- (Chef_salary/100 * 5) Где c.Chef_ID не в (выберите Chef_ID из MEAL m) –

ответ

0
UPDATE CHEF 
SET Chef_salary = Chef_salary-(Chef_salary/100 * 5) 
WHERE Chef_ID in (SELECT c.Chef_ID 
FROM CHEF c LEFT JOIN MEAL m ON (c.Chef_ID=m.Chef_ID) 
GROUP BY c.Chef_ID 
HAVING count(m.Chef_ID)='0' 
); 
0

Если я правильно понимаю вашу логику правильно, вы хотите NOT EXISTS и коррелированных подзапросов:

UPDATE CHEF 
    SET Chef_salary = Chef_salary - (Chef_salary/100 * 5) 
    WHERE NOT EXISTS (SELECT 1 
         FROM MEAL m 
         WHERE chef.Chef_ID = m.Chef_ID 
        ); 
0
Update CHEF c Set Chef_salary = Chef_salary-(Chef_salary/100 * 5) 
Where c.Chef_ID not in (Select Chef_ID from MEAL m) 
Смежные вопросы