Oracle:Sql根据同一表另一行的值更新同一表的行
Posted
技术标签:
【中文标题】Oracle:Sql根据同一表另一行的值更新同一表的行【英文标题】:Oracle: Sql to update row of the same table based on value from another row of the same table 【发布时间】:2017-06-09 05:53:09 【问题描述】:对于满足以下条件的商品记录,我需要一个 sql 来将 price 列更新为 999:
-
两条记录的 ITEM 位置不应为空。
将价格更新为 999,其中 2 条记录之一的位置为空。
输出表样本
ID 位置 项目价格 1 空 101 999 2 123 101 0 3 空 102 0 4 空 102 0 5 124 103 0 6 空 103 999【问题讨论】:
我已经发布了答案。 (不得不更新它,因为我两次混淆了位置和价格。)顺便说一句,你的实际问题是什么不清楚。如您所见,该声明相当直截了当。下次展示您的更新声明并告诉我们您遇到的问题。 请发布您尝试过的查询/方法。不要发布我需要查询的内容。 我使用了以下查询,但它只更新了第一个 id 记录为空的集合:UPDATE SAMPLE SAMP2 SET SAMP2.PRICE=999 WHERE SAMP2.ID IN (SELECT SAMP2.ID FROM SAMPLE SAMP1 JOIN SAMP1.ITEM=SAMP2.ITEM 上的 SAMPLE SAMP2,其中 SAMP1.SLOT_ID 不为空且 SAMP2.SLOT_ID 为空) 【参考方案1】:使用IN
(或EXISTS
)检查是否存在位置不为空的项目编号记录。
update items
set price = 999
where location is null
and item_id in (select item_id from items where location is not null);
【讨论】:
【参考方案2】:我已经创建了一个表。请在下面找到查询。只需执行并检查。您应该按照您的要求得到想要的结果。
CREATE TABLE TABLE1(ID INT, LOCATION INT, ITEM INT, PRICE INT)
INSERT INTO TABLE1 VALUES
(1, NULL, 101, 0),
(2, 123 , 101, 0),
(3, NULL, 102, 0),
(4, NULL, 102, 0),
(5, 124 , 103, 0),
(6, NULL, 103, 0);
SELECT* FROM TABLE1;
WITH CTE AS
(
SELECT ITEM, COUNT(*) AS COUNTLOC FROM TABLE1 WHERE LOCATION IS NULL GROUP BY ITEM
)
UPDATE TABLE1
SET PRICE = 999 WHERE ITEM IN(SELECT ITEM FROM CTE WHERE COUNTLOC<2) AND LOCATION IS NULL;
【讨论】:
【参考方案3】:update TABLE1 t1
INNER JOIN (select t12.item from TABLE1 t12 where t12.LOCATION is null
GROUP BY t12.ITEM
HAVING count(t12.ITEM)=1)aaa on aaa.item = t1.ITEM
set t1.PRICE = 999 where t1.LOCATION is null
【讨论】:
以上是关于Oracle:Sql根据同一表另一行的值更新同一表的行的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SQL 中对触发器进行语法化,以便在插入后从同一个表中更新列(oracle 数据库)