Sql UPDATE语句的问题
我想给实验室里最赚钱的员工加薪9% 我写这个查询是为了找到最赚钱的员工: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
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语句。看这个。