如何对列中的值进行排序并更新表?

时间:2012-04-09 20:56:02

标签: sql

我是sql的新手,不能自己做。所以我需要你的帮助。 我想在列中对值进行排序,然后保存更改。但我不知道该怎么做。

表格如下:

Id | Name | SomeDescription
---------------------------
1  |Best  | Description1
2  |Worth | Description2
3  |Good  | Description3

我希望得到类似的东西:

Id | Name | SomeDescription
---------------------------
1  |Best  | Description1
2  |Good  | Description3
3  |Worth | Description2

所以我需要对“id”和“name”列进行排序。

我使用以下语句对“name”列的值进行排序:

SELECT * FROM games ORDER BY name ASC

但是如何对id列的值进行排序并保存表中的更改? 请帮忙。

7 个答案:

答案 0 :(得分:21)

你必须使用第二张表

  1. 创建一个与games2表具有相同结构的新表games,确保ID自动递增

    CREATE TABLE `games2` LIKE `games`;
    
  2. 将数据复制到games2

    INSERT INTO `games2` (`Name`, `SomeDescription`) SELECT `Name`, `SomeDescription` FROM `games` ORDER BY `Name`
    
  3. 删除或移动旧表

    -- DROP TABLE `games`;
    -- or
    RENAME TABLE `games` TO `games1`;
    
  4. 将新表重命名为旧名称

    RENAME TABLE `games2` TO `games`;
    
  5. 这些步骤将产生您想要的效果。

答案 1 :(得分:4)

您可以使用ROW_NUMBER排名功能对行重新编号。

SELECT UnsortedId = id
, SortedId = ROW_NUMBER() OVER (ORDER BY g.name, g.id)
FROM games 

答案 2 :(得分:1)

这很简单。只需使用几个代码。我试过这个并且它正在工作。首先在同时对值进行排序时创建临时表。

    create table new as select * from games order by name;

然后使用

删除游戏桌
    drop table games;

现在再次使用相同的属性和数据创建游戏表,使用相同的属性和数据(这里排序是可选的),

    create table games as select * from new order by name;

现在删除临时表'new'

    drop table new;

现在检查一下你的桌子。它必须整理出来。

答案 3 :(得分:1)

您可以使用更简单的alter table命令。

mysql> ALTER TABLE games ORDER BY name asc;

这就是全部!

答案 4 :(得分:0)

您可以同时对两个字段进行排序。

SELECT *
FROM games
ORDER BY id DESC, name ASC

我不明白表格中保存更改的含义。 ORDER BY,只是更改您正在查看的显示,除非您执行UPDATE,否则不会更改表格中的数据。

如果您不熟悉SQL,那么网上有很多教程可以提供帮助:

SQL Course

Beginner SQL Tutorial

SQL Tutorial - Learn SQL

根据评论进行编辑,这可以一步完成:

create table #temp
(
    id int,
    name varchar(50),
    somedesc varchar(50)
)

insert into #temp values (1, 'best', 'desc1')
insert into #temp values (2, 'worth', 'desc2')
insert into #temp values (3, 'good', 'desc3')

update t1
SET t1.id = t2.rn
    , t1.somedesc = t1.somedesc
FROM #temp t1
JOIN 
(
    select id, name, somedesc, row_number() over(order by name, id) as rn
    from #temp 
) t2
on t1.id = t2.id

select *
from #temp
order by id

drop table #temp

答案 5 :(得分:0)

这是我的解决方法,愚蠢的简单方法:

  1. 提取到临时表

SELECT SortKeyValue (添加任何其他固定值,只是不包括现有序列) INTO #Temp FROM SourceTable;

  1. 清空表格:

TRUNCATE TABLE SourceTable

  1. 重新插入:

INSERT INTO SourceTable(SortKeyValue,DisplayOrder (以及其他字段)) SELECT SortKeyValue,ROW_NUMBER()以上(按SortKeyValue排序)为DispOrd (以及其他字段) FROM #Temp;

  1. 完成!

答案 6 :(得分:-2)

SQL> SELECT * FROM游戏      ORDER BY ID,NAME;