2013-05-25 7 views
0

J'essaie de combiner les colonnes de deux requêtes comme suit: Je suis à la recherche d'une solution d'accès.MS Access Join Query

Query1:     Query2: 
-------------   ------------- 
Col1 Col2    ColA ColB 
-------------   ------------- 
314  2    314  1 
314  3    314  7 
314  4    314  3 
314  5    314  8 

Desired Output: 
Col1 Col2 ColB 
314  5  8 
314  4  7 
314  3  3 
314  2  1 

J'ai essayé jointure:

SELECT Query1.col1, Query1.col2, Query2.colB 
FROM Query2 INNER JOIN Query1 ON Query2.colA = Query1.col1; 

Mais je suis obtenir cette sortie indésirable:

Undesired output: 
Col1 Col2 ColB 
314 4 1 
314 5 1 
314 2 1 
314 3 1 
314 4 7 
314 5 7 
314 2 7 
314 3 7 
314 4 3 
314 5 3 
314 2 3 
314 3 3 
314 4 8 
314 5 8 
314 2 8 
314 3 8 

Merci!

+1

Il n'y a aucun moyen de dire comment les enregistrements doivent être comparés - la seule chose que je peux voir est que chaque "colonne" devrait être dans l'ordre décroissant. S'il y a une autre façon de «faire correspondre» les enregistrements, ajoutez-les à votre question. –

+0

Y a-t-il une autre colonne que vous ne montrez pas? Celui qui détermine les enregistrements de commande sont affichés? Il n'y a pas assez d'informations dans les résultats de votre requête pour faire correspondre les colonnes avec ce que vous avez montré. –

+0

fthiella a effectivement répondu à cette question, mais en utilisant MySQL comme base de données. [link] (http://sqlfiddle.com/#!2/858b5/2) J'ai essayé de l'utiliser dans Access avec les champs réels mais il ne fonctionnera pas. – matley

Répondre

0

Il s'agit d'un problème très difficile dans Access car vous rejoignez les rangs des deux colonnes. Voici une approche, bien qu'il ne soit pas particulièrement efficace:

SELECT Query1.col1, Query1.col2, Query2.colB 
FROM (select q.*, 
      (select count(*) 
       from query1 as q2 
       where q2.col2 >= q.col2 and q2.col1 = q.col1 
      ) as seqnum 
     from Query1 as q 
    ) as query1 INNER JOIN 
    (select q.*, 
      (select count(*) 
       from query2 as q1 
       where q1.colB >= q.colB and q1.colA = q.colA 
      ) as seqnum 
     from Query2 as q 
    ) as Query2 
    ON Query2.col1 = Query1.colA and 
     Query2.seqnum = Query1.seqnum; 

Cette construction est beaucoup plus facile dans d'autres bases de données, telles que SQL Server où vous pouvez utiliser la fonction row_number().

En outre, cette version fonctionne en supposant que vous n'avez pas de valeurs en double dans les deux colonnes. Avec les doublons, vous auriez besoin d'une autre colonne pour identifier chaque ligne (un identifiant ou une date de création, par exemple).

+0

Merci Gordon mais Access me demande d'entrer la valeur du paramètre dans q2.col2. Aussi j'essaye d'éditer ma question pour remplacer ON Query2.col1 = Query1.colA à ON Query2.colA = Query1.col1 mais je ne pourrais pas. – matley

+0

Je pense avoir récupéré les colonnes colA, colB, col1 et col2 entre les tables. –

+0

J'ajuste la requête en conséquence mais je demande toujours le paramètre. Êtes-vous sûr que cela fonctionnera dans Access? – matley