查询为每个数据包创建标识符

时间:2012-02-10 03:38:27

标签: sql ms-access

对不起,标题不是很具描述性,但这是一个棘手的问题。

我有一些数据,大约200行或更多行,每行都有一个PacketID,所以有几行属于同一个数据包。我需要做的是将所有PacketID从(示例 - BDFD-2)转换为只是一个数字(例1),因此所有带有数据包标识符x的条目都需要有一个数据包标识符为3.是否存在SQL查询可以做到这一点?或者我只需要手动完成。

3 个答案:

答案 0 :(得分:2)

您询问了一个查询。我写了一个快速的VBA程序,只是因为它很容易。但我不确定它是否适合你的情况。

我使用new_PacketID的数字列创建了tblPackets。我希望能更清楚地看到发生了什么。如果您确实需要使用新号码替换PacketID,则可以更改将CStr(lngPacketID)存储到该文本字段的过程。所以这是我开始使用的示例数据:

PacketID new_PacketID packet_data
BDFD-2                a
R2D2-22               aa
BDFD-2                b
R2D2-22               bb
EMC2-0                aaa
EMC2-0                bbb

这是运行程序后的表。

PacketID new_PacketID packet_data
BDFD-2              1 a
R2D2-22             3 aa
BDFD-2              1 b
R2D2-22             3 bb
EMC2-0              2 aaa
EMC2-0              2 bbb

代码......

Public Sub RenumberPacketIDs()
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim lngPacketID As Long
    Dim strLastPacketID As String
    Dim strSql As String

    strSql = "SELECT PacketID, new_PacketID" & vbCrLf & _
        "FROM tblPackets" & vbCrLf & _
        "ORDER BY PacketID;"
    Set db = CurrentDb
    Set rs = db.OpenRecordset(strSql)

    With rs
        Do While Not .EOF
            If !PacketID <> strLastPacketID Then
                lngPacketID = lngPacketID + 1
                strLastPacketID = !PacketID
            End If
            .Edit
            !new_PacketID = lngPacketID
            .Update
            .MoveNext
        Loop
        .Close
    End With

    Set rs = Nothing
    Set db = Nothing
End Sub

我认为这样的方法对于一次性转换可能没问题。但是,如果这是您需要重复执行的操作,则可能会更复杂...尤其是如果您需要将每个PacketID替换为从一次运行到下一次运行的相同数字...例如。 BDFD-2第一次被1替换,因此每次运行该程序时必须替换为1。

答案 1 :(得分:0)

如果您只有几个数据包ID,则可以使用update:

UPDATE table_name
   SET PacketID = 
       (
           CASE PacketID
               WHEN 'BDFD-2' THEN 3
               WHEN 'ABCD-1' THEN 5
               ELSE 2
           END
       )

ELSE是可选的。

答案 2 :(得分:0)

我不确定为什么你甚至想把数据包ID转换为数字,它们看起来完全没问题。您可以按如下方式创建数据包表

SELECT DISTINCT TableOfRows.Packet_id AS PacketId INTO Packets FROM TableOfRows;

然后,您可以使用它来选择您感兴趣的数据包并显示相应的行