2013-01-17 54 views
1

我正在使用尋呼系統。對於我的一些同事,我需要創建一個目錄。目錄中的每個人都有一個PAGER_ID和一個MESSAGING_ID。 PAGER_ID對於給定的分頁設備是唯一的,而MESSAGING_ID對於一個人是唯一的。一個小組可能會輪班工作,並通過一個單一的設備,從班次轉向導致幾個人有相同的PAGER_ID和不同的MESSAGING_ID。這很好,通過設計。如何顯示一對多的一對多關係

對於我們的目錄中的用戶需要以下條件滿足:

  1. 每個PAGER_ID一次和唯一一次(我知道我可以通過SELECT TOP 1做到這一點的PAGER_ID)
  2. 一個10現身當PAGER_ID具有十個數字的MESSAGING_ID和一個或多個具有不同數字位數的其他MESSAGING_ID時,數字MESSAGING_ID是首選。
  3. 如果沒有10位數字的MESSAGING_ID,則將使用任何其他位數的MESSAGING_ID。

簡而言之:他們只想看到一條PAGER_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  | 
-------------------------------------------- 

任何想法?

回答

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是長整型代替文字,使用...

  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是長整型,而不是文字,改變Max(Len(MESSAGING_ID))Max(Len(CStr(MESSAGING_ID)))Len(MESSAGING_ID)Len(Cstr(MESSAGING_ID))

+0

非常感謝HansUp!這正是我想要做的。抱歉,登記,測試和評論花了很長時間。當然,老闆讓我有另一個難題!我很可能會在這裏發佈。 – mdames

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是你的表。

1

確定可以說你的表是MyTable的,那麼所有你需要的是組:

SELECT FIRST(Name), PAGER_ID, MAX(MESSAGING_ID) 
FROM MyTable 
GROUP BY PAGER_ID