我试图让这个实验室中最赚钱的员工加薪9%。
我写了这个查询来找到最有利可图的员工:
SELECT *
FROM (
SELECT SALESPERSONS.EmpID
, SALESPERSONS.Ename
, ((SUM(NVL(ORDERITEMS.Qty, 0) * NVL(INVENTORY.Price, 0)) - NVL(SALESPERSONS.Salary, 0))) AS Profit
FROM SALESPERSONS, ORDERS, ORDERITEMS, INVENTORY
WHERE SALESPERSONS.EmpID = ORDERS.EmpID (+)
AND ORDERS.OrderID = ORDERITEMS.OrderID (+)
AND ORDERITEMS.PartID = INVENTORY.PartID (+)
GROUP BY SALESPERSONS.EmpID
, SALESPERSONS.Ename
, SALESPERSONS.Salary
ORDER BY Profit DESC)
WHERE rownum = 1)
我已经验证这是有效的(它不是一个非常大的数据库,所以我能够手动完成)。
然后,我创建了一个UPDATE语句,为这一名员工提供加薪:
UPDATE SALESPERSONS
SET Salary = (
SELECT MAX(SALARY)+MAX(SALARY)*.09
FROM SALESPERSONS, (SELECT *
FROM (
SELECT SALESPERSONS.EmpID
, SALESPERSONS.Ename
, ((SUM(NVL(ORDERITEMS.Qty, 0) * NVL(INVENTORY.Price, 0)) - NVL(SALESPERSONS.Salary, 0))) AS Profit
FROM SALESPERSONS, ORDERS, ORDERITEMS, INVENTORY
WHERE SALESPERSONS.EmpID = ORDERS.EmpID (+)
AND ORDERS.OrderID = ORDERITEMS.OrderID (+)
AND ORDERITEMS.PartID = INVENTORY.PartID (+)
GROUP BY SALESPERSONS.EmpID
, SALESPERSONS.Ename
, SALESPERSONS.Salary
ORDER BY Profit DESC)
WHERE rownum = 1));
更新所有11名员工的工资。
我试图找出我在这里做错了什么。我的热门查询只返回一个结果。
答案 0 :(得分:0)
以下修改应该有效。
UPDATE SALESPERSONS
SET Salary = (
SELECT MAX(SALARY)+MAX(SALARY)*.09
FROM SALESPERSONS WHERE
EmpID in
(SELECT EmpID
FROM (
SELECT SALESPERSONS.EmpID
, SALESPERSONS.Ename
, ((SUM(NVL(ORDERITEMS.Qty, 0) * NVL(INVENTORY.Price, 0)) - NVL(SALESPERSONS.Salary, 0))) AS Profit
FROM SALESPERSONS, ORDERS, ORDERITEMS, INVENTORY
WHERE SALESPERSONS.EmpID = ORDERS.EmpID (+)
AND ORDERS.OrderID = ORDERITEMS.OrderID (+)
AND ORDERITEMS.PartID = INVENTORY.PartID (+)
GROUP BY SALESPERSONS.EmpID
, SALESPERSONS.Ename
, SALESPERSONS.Salary
ORDER BY Profit DESC)
WHERE rownum = 1));
答案 1 :(得分:0)
我更多的是sql-server
家伙,但我认为您的UPDATE
没有WHERE
,所以它会更新表格中的每一行获得薪水对于使用内部查询的每一行。您必须在外层有一个WHERE
,指示您要更新的行。
如果这是一次性查询,您可以获得相关员工的PK,并在WHERE
中使用。
也许是这样的:
UPDATE SALESPERSONS
SET Salary = Salary+Salary*.09
WHERE EmpId=(
SELECT TOP 1 SALESPERSONS.EmpID
FROM SALESPERSONS, ORDERS, ORDERITEMS, INVENTORY
WHERE SALESPERSONS.EmpID = ORDERS.EmpID
AND ORDERS.OrderID = ORDERITEMS.OrderID
AND ORDERITEMS.PartID = INVENTORY.PartID
GROUP BY SALESPERSONS.EmpID
, SALESPERSONS.Ename
, SALESPERSONS.Salary
ORDER BY Profit DESC);