Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql UPDATE语句的问题_Sql_Oracle_Sql Update_Subquery_Aggregate Functions - Fatal编程技术网

Sql UPDATE语句的问题

Sql UPDATE语句的问题,sql,oracle,sql-update,subquery,aggregate-functions,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, INVENTO

我想给实验室里最赚钱的员工加薪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 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名员工的工资


我在想我到底做错了什么。我的top查询只返回一个结果

下面的修改应该有效

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));
我更喜欢sql server,但我认为您的更新没有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);

从销售人员中选择*。。。创建笛卡尔积。我想知道这一点,但这一点:从销售人员,选择销售人员。从。。。返回了相同的结果。我知道你说这是一个小数据库,但我想知道这个更新查询的性能和可读性。有趣的是,在ID上引用多个表并使用WHERE implicit JOIN子句而不是JOIN explicit JOIN语句。看这个。