2015-06-13 127 views
0

我有两个表CHEF和MEAL。 我想要做的是降低每个尚未制作单一餐的厨师的薪水。 这是我的查询SQL两个表单行子查询返回多个行

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 FROM CHEFÇLEFT JOIN餐M于(C .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设置Chef_salary = Chef_salary-(Chef_salary/100 * 5) 其中c.Chef_ID不在(从MEAL m中选择Chef_ID) –

回答

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)