每个人,我一直在处理最近一小时的查询,我需要按国家字段按字母顺序排序并更新其 sort_order 字段增量数。
我编写了一个选择查询,按字母顺序对我的国家/地区字段进行排序,并添加了一个行号。到目前为止一切都很好。
我的选择查询回复是:
objid | country | sort_order | my_rownum
--------------------------------------------
c1 | America | 0 | 1
g2 | Englanc | 0 | 2
k1 | France | 0 | 3
现在,我需要使用 my_rownum 值更新我的排序 _order字段。
Country_Info表:
objid | country | sort_order
----------------------------
c1 | America | 0
g2 | Englanc | 0
k1 | France | 0
更新后的表必须是这样的:
objid | country | sort_order
----------------------------
c1 | America | 1
g2 | Englanc | 2
k1 | France | 3
我尝试了很多sql查询,但我的查询出了问题。
示例伪查询,用于解释我需要的内容。我无法合并逻辑。
-- sort_order will set when sample query objid and counrty_info objid are equals
update country_info
set sort_order = (value from subquery here)
where (value equivlance from subquery for objid here)
--Subquery
(select c.objid, c.country, c.sort_order, row_number() over (partition by 1 order by 1) as my_rownumber
from counrty c where <bla bla> order by c.country asc)
...问候
答案 0 :(得分:1)
假设您将表名作为table1,您可以使用如下的merge子句:
MERGE INTO table1 t1
USING (SELECT s.*, ROWNUM my_rownum
FROM ( SELECT *
FROM table1
ORDER BY 3) s) t2
ON (T1.objid = t2.objid)
WHEN MATCHED
THEN
UPDATE SET T1.sort_order = t2.my_rownum
我希望这会有所帮助
答案 1 :(得分:0)
如果使用SQL2005或更高版本,请尝试:
select *, sort_order = dense_rank() over (order by country)
from yourtable
这会出现第一个国家1
的所有出现,第二个2
的所有出现,依此类推。如果您需要唯一排序值,请使用row_number()
。