1

我正在使用寻呼系统。对于我的一些同事,我需要创建一些目录。目录中的每个人都有一个 PAGER_ID 和一个 MESSAGING_ID。PAGER_ID 对于给定的寻呼设备是唯一的,而 MESSAGING_ID 对于一个人是唯一的。一个小组可能轮班工作,并在轮班之间传递一个设备,导致几个人拥有相同的 PAGER_ID 和不同的 MESSAGING_ID。这很好,而且是设计使然。

对于我们的目录,用户希望满足以下条件:

  1. 每个 PAGER_ID 只显示一次(我知道我可以通过 SELECT TOP 1 到 PAGER_ID 来做到这一点)
  2. 当 PAGER_ID 的 MESSAGING_ID 为十位数字和一个或多个具有不同位数的其他 MESSAGING_ID 时,首选十位数字的 MESSAGING_ID。
  3. 如果没有 10 位数的 MESSAGING_ID,则可以使用具有任何其他位数的 MESSAGING_ID。

简而言之:他们只想查看 PAGER_ID / MESSAGING_ID 的一条记录。他们不在乎是否每个人都列在目录中。他们并不真正关心哪个 MESSAGING_ID,只要每个 PAGER_ID 在目录中显示只有一个 MESSAGING_ID 并且只要 10 位 MESSAGING_ID 优先于那些不是 10 位长的 MESSAGING_ID。

我尝试了 TOP 和 IIF 查询的组合,但无法让它们以所需的方式一起玩得很好。

我的基本选择查询是:

SELECT
    tbl_Amcom_Prod.NAME,
    tbl_Amcom_Prod.PAGER_ID,
    tbl_Amcom_Prod.MESSAGING_ID
FROM tbl_Amcom_Prod
WHERE
    (((tbl_Amcom_Prod.PAGER_ID) Like "241662"
    Or (tbl_Amcom_Prod.PAGER_ID) Like "18888"))
ORDER BY tbl_Amcom_Prod.PAGER_ID;

结果是:

|     NAME       | PAGER_ID | MESSAGING_ID |
--------------------------------------------
| TESTER 1       |    18888 | 18888        |
--------------------------------------------
| SMITH, MARK    |    18888 | 5735551262   |
--------------------------------------------
| SUPERVISOR     |   241662 | 102621       |
--------------------------------------------
| JOHN, JONES    |   241662 | 101436       |
--------------------------------------------
| SEEGER, ROBERT |   241662 | 101409       |
--------------------------------------------

他们想看到这个:

|     NAME       | PAGER_ID | MESSAGING_ID |
--------------------------------------------
| SMITH, MARK    | 18888    | 5735551262   |
--------------------------------------------
| SUPERVISOR     | 241662   | 102621       |
--------------------------------------------

有任何想法吗?

4

3 回答 3

1

也许:

SELECT tt.NAME, tt.PAGER_ID, tt.MESSAGING_ID
FROM tt
WHERE tt.PAGER_ID In (
    SELECT [PAGER_ID] 
    FROM tt a 
    WHERE  a.MESSAGING_ID IN (
        SELECT TOP 1 MESSAGING_ID 
        FROM tt 
        ORDER BY Len(MESSAGING_ID) DESC,PAGER_ID))

tt 是你的桌子在哪里。

于 2013-01-17T21:22:08.617 回答
1

好的,假设您的表是 MyTable,那么您只需要分组:

SELECT FIRST(Name), PAGER_ID,  MAX(MESSAGING_ID)
FROM MyTable
GROUP BY PAGER_ID
于 2013-01-17T22:07:13.977 回答
1

如果PAGER_IDMESSAGING_ID都是文本数据类型,则此查询将返回您请求的结果。

SELECT
    t.NAME,
    t.PAGER_ID,
    t.MESSAGING_ID
FROM
    (
        SELECT
            sub1.PAGER_ID,
            DLookUp(
                "MESSAGING_ID",
                "tbl_Amcom_Prod",
                "PAGER_ID = '" & sub1.PAGER_ID &
                    "' AND Len(MESSAGING_ID) = " &
                    sub1.MESSAGING_ID_max_length
            ) AS MESSAGING_ID
        FROM
            (
                SELECT
                    PAGER_ID,
                    Max(Len(MESSAGING_ID))
                        AS MESSAGING_ID_max_length
                FROM tbl_Amcom_Prod
                GROUP BY PAGER_ID
            ) AS sub1
    ) AS sub2
    INNER JOIN tbl_Amcom_Prod AS t
    ON sub2.MESSAGING_ID = t.MESSAGING_ID
WHERE t.PAGER_ID In ("241662","18888")
ORDER BY t.PAGER_ID;

如果PAGER_ID是 Long Integer 而不是文本,请使用 ...

            DLookUp(
                "MESSAGING_ID",
                "tbl_Amcom_Prod",
                "PAGER_ID = " & sub1.PAGER_ID &
                    " AND Len(MESSAGING_ID) = " &
                    sub1.MESSAGING_ID_max_length
            ) AS MESSAGING_ID

和 ...

WHERE t.PAGER_ID In (241662,18888)

如果MESSAGING_ID是 Long Integer 而不是文本,则更Max(Len(MESSAGING_ID))改为Max(Len(CStr(MESSAGING_ID)))Len(MESSAGING_ID)Len(Cstr(MESSAGING_ID))

于 2013-01-18T19:06:22.853 回答