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 0 2 123 101 0 3 空 102 0 4 空 102 0 5 124 103 0 6 空 103 0

输出表样本

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 数据库)

Oracle:使用来自同一表的聚合值更新表中的值

在更新触发器之前或之后更改同一表中的值(oracle)

Oracle SQL:使用来自同一表的另一列的数据更新表

sql 将多行显示为一行,如果一张表中有几行数据中的同一列的值是相同,那么只显示为一行的数据

SQL Server2008 触发器中,根据一个表修改另外一个表