2013-01-17 7 views
1

Je travaille avec un système de radiomessagerie. Pour certains de mes collègues, je dois créer quelque chose d'un répertoire. Chaque personne dans le répertoire a un PAGER_ID et un MESSAGING_ID. Le PAGER_ID est unique à un périphérique de pagination donné, tandis qu'un MESSAGING_ID est unique à une personne. Un groupe peut travailler en équipes et passer un seul périphérique de décalage à décalage, ce qui fait que plusieurs personnes ont un PAGER_ID identique et un MESSAGING_ID différent. C'est bien et par conception.Comment afficher une relation un à plusieurs

Pour notre annuaire les utilisateurs veulent les critères suivants sont réunis:

  1. Chaque PAGER_ID pour montrer une fois et une seule fois (je sais que je pourrais le faire en SELECT TOP 1 à la PAGER_ID)
  2. A dix Le chiffre MESSAGING_ID est préféré quand un PAGER_ID a un MESSAGING_ID de dix chiffres et un ou plusieurs autres MESSAGING_ID avec un nombre différent de chiffres.
  3. S'il n'y a pas 10 chiffres MESSAGING_ID un MESSAGING_ID avec un autre nombre de chiffres fera.

Succinctement: Ils veulent voir un seul enregistrement pour un PAGER_ID/MESSAGING_ID. Ils ne se soucient pas si chaque personne est répertoriée dans le répertoire. Ils ne se soucient pas vraiment du MESSAGING_ID tant que chaque PAGER_ID est affiché dans le répertoire avec un seul MESSAGING_ID et tant qu'un MESSAGING_ID à 10 chiffres a la préférence sur ceux de 10 chiffres.

J'ai essayé des combinaisons de requêtes TOP et IIF et je n'ai pas réussi à les faire jouer tous ensemble de la manière requise.

Ma requête de sélection de base est:

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; 

et les résultats dans ce:

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

Ils veulent voir ceci:

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

Toutes les idées?

Répondre

1

Si PAGER_ID et MESSAGING_ID sont le type de données texte, cette requête renvoie les résultats que vous avez demandé.

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; 

Si PAGER_ID est Entier long au lieu de texte, utilisation ...

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

et ...

WHERE t.PAGER_ID In (241662,18888) 

Si MESSAGING_ID est Entier long au lieu du texte, changer Max(Len(MESSAGING_ID))-Max(Len(CStr(MESSAGING_ID))) et Len(MESSAGING_ID)-Len(Cstr(MESSAGING_ID))

+0

grand merci HansUp! Cela fait exactement ce que je voulais faire. Désolé, il a fallu si longtemps pour vérifier, tester et commenter. Le patron m'a encore sur une autre énigme, bien sûr! Je vais probablement poster ça très bientôt. – mdames

1

Peut-être:

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)) 

Où tt est votre table.

1

Ok permet de dire votre table est MyTable, tout ce dont vous avez besoin est de groupe:

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