UPDATE语句的问题

时间:2015-02-03 03:33:29

标签: sql oracle sql-update subquery aggregate-functions

我试图让这个实验室中最赚钱的员工加薪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名员工的工资。

我试图找出我在这里做错了什么。我的热门查询只返回一个结果。

2 个答案:

答案 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);
相关问题