使用多列子查询在同一个表上更新语句

时间:2014-08-22 17:26:03

标签: sql oracle subquery

每个人,我一直在处理最近一小时的查询,我需要按国家字段按字母顺序排序并更新其 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)

...问候

2 个答案:

答案 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()