SQL排序表和更新列

时间:2012-09-21 10:52:16

标签: sql excel ms-access

您可以告诉我如何使用SQL在MS Access数据库中执行以下操作。?

我有一个看起来像这样的表:

MyTable的

Plan    Item        Sort_Number
-------------------------------------
11026    ZSC1753D   
11018    PS13-2     
11026    ZSC1753B   
11018    PSHH278B   
11026    ZSO1753A   
11018    PS3169     
11027    ZSC1754B   
11027    ZSC1754A   
11026    ZSC1753A   
11026    ZSC1753C   

我有一张表(上图),需要先按计划(第1列)排序,然后按物品的升序(第2列)排序,第3列排序号需要按顺序号1填充xx ..对于每个不同的计划。

所以最终的排序表将如下所示:

MyTable的

Plan    Item    Sort_Number
-------------------------------------
11018   PS13-2      1
11018   PS3169      2
11018   PSHH278B    3
11026   ZSC1753A    1
11026   ZSC1753B    2
11026   ZSC1753C    3
11026   ZSC1753D    4
11026   ZSO1753A    5
11027   ZSC1754A    1
11027   ZSC1754B    2

我可以用SQL做到这一点吗?在MS Access数据库中。

先谢谢

2 个答案:

答案 0 :(得分:3)

UPDATE myTable d, 
    (SELECT Plan, Item, 
       (SELECT count(*) + 1 
        FROM myTable i 
        WHERE i.Plan = o.Plan and i.Item < o.Item) as Sort_Number
    FROM myTable o) as s
SET d.Sort_Number = s.Sort_Number
WHERE d.Plan = s.Plan and d.Item = s.Item

OR

UPDATE myTable d INNER JOIN 
    (SELECT Plan, Item, 
       (SELECT count(*) + 1 
        FROM myTable i 
        WHERE i.Plan = o.Plan and i.Item < o.Item) as Sort_Number
    FROM myTable o) s
ON d.Plan = s.Plan and d.Item = s.Item
SET d.Sort_Number = s.Sort_Number

编辑:我知道这样做效率不高,但对于数量有限的记录,它可以正常运行。

EDIT2 :请注意,我没有在MS-Access中尝试此查询。我希望它能为您提供如何完成的输入。

EDIT3 :使用临时表

SELECT Plan, Item, 
       (SELECT count(*) + 1 
        FROM myTable i 
        WHERE i.Plan = o.Plan and i.Item < o.Item) as Sort_Number
INTO TEMPTABLEFORTEST
FROM myTable o

UPDATE myTable i 
INNER JOIN TEMPTABLEFORTEST o 
ON i.Plan = o.Plan and i.Item = o.Item set i.Sort_Number = o.Sort_Number

DROP Table TEMPTABLEFORTEST

答案 1 :(得分:1)

创建SQL语句到更新 Sort_Number具有挑战性。但是,VBA的程序非常简单。我在Access 2007中使用名为“ Plans ”的表中的示例数据对此进行了测试。在下面的“FROM”行中替换您的真实表名。

Public Sub Update_Sort_Numbers()
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim strSelect As String
    Dim lngCurrentPlan As Long
    Dim lngSortNum As Long

    strSelect = "SELECT p.Plan, p.Item, p.Sort_Number" & vbCrLf & _
        "FROM Plans AS p" & vbCrLf & _
        "ORDER BY p.Plan, p.Item;"
    Set db = CurrentDb
    Set rs = db.OpenRecordset(strSelect)
    With rs
        Do While Not .EOF
            If rs!Plan <> lngCurrentPlan Then
                lngCurrentPlan = rs!Plan
                lngSortNum = 1
            End If
            Debug.Print !Plan, ![Item], lngSortNum
            .Edit
            !Sort_Number = lngSortNum
            .Update
            lngSortNum = lngSortNum + 1
            .MoveNext
        Loop
        .Close
    End With
    Set rs = Nothing
    Set db = Nothing
End Sub