解决复杂的sql子查询

时间:2016-08-07 06:33:46

标签: sql oracle

这是我的查询,我确切地知道问题所在。它从select语句里面返回多个列,而它只更新一列。关键是第二列用于条件。 我怎样才能达到目标?是否有任何特定的SQL语法。

update xaddress B set (B.xrank)=
(select a.x1001olcsrl,row_number() over(partition by a.x1001olcsrl order by a.x1001olcsrl) as rnk
from xaddress a) 
where x1001olcsrl=B.x1001olcsrl

2 个答案:

答案 0 :(得分:0)

您需要再添加一个子查询以仅选择一列。替换'价值'与你的原始价值。

用于单行更新。

update xaddress 
set xrank = (Select rnk from (select a.x1001olcsrl,row_number() over(partition by a.x1001olcsrl order by a.x1001olcsrl) as rnk 
            from xaddress) where x1001olcsrl= 'Value')
where x1001olcsrl= 'Value'

用于整个表格更新。

With CTE  As
(
 select x1001olcsrl,row_number() over(partition by x1001olcsrl order by x1001olcsrl as rnk 
 from xaddress
)
update xaddress
SET xrank = rnk
FROM xaddress a
INNER JOIN CTE b ON a.x1001olcsrl = b.x1001olcsrl

答案 1 :(得分:0)

使用MERGE,这是oracle版本的update-with-join:

MERGE INTO xaddress a
USING (select
         x1001olcsrl,
         row_number() over(partition by x1001olcsrl order by x1001olcsrl) rnk
       from xaddress) x
ON x.x1001olcsrl = a.x1001olcsrl
WHEN MATCHED THEN UPDATE
SET xrank = rnk