2016-03-30 1 views
1

J'ai 4 tables différentes, avec le champ Id. Je veux créer une cinquième table avec quatre champs; chaque champ contient une liste de tous les identifiants de chaque table respectivement. Les ID n'ont rien à faire les uns avec les autres, donc je ne peux pas penser à quoi les rejoindre. Si je fais un syndicat, je ne saurai pas d'où vient le dossier. Y a-t-il un moyen de le faire?Comment sélectionner plusieurs champs de plusieurs tables sans relation entre eux?

enter image description here

+0

Ceci est très difficile à faire dans MS Access. –

+1

Si les ID n'ont rien à voir l'un avec l'autre, à quoi cela sert-il de les regrouper dans une même table? Qu'est-ce que vous voulez réaliser? Si nous comprenons cela, nous pouvons peut-être vous aider. – massie

+0

Ce serait facile avec une boucle d'enregistrements VBA. Mais est-ce que les 4 tables ont le même nombre de lignes? – Andre

Répondre

1

C'est une solution en VBA, en utilisant des méthodes de DAO. Par souci de brièveté, j'ai inclus seulement table1 et table3. Non testé, mais cela devrait fonctionner. :)

Public Sub FillResult() 

    Dim DB As DAO.Database 
    Dim rsT As DAO.Recordset ' Target 
    Dim rs1 As DAO.Recordset, rs3 As DAO.Recordset ' Source tables 

    Set DB = CurrentDb 
    ' Clean out result table 
    DB.Execute "DELETE * FROM tResult" 
    Set rsT = DB.OpenRecordset("tResult", dbOpenDynaset, dbAppendOnly) 

    Set rs1 = DB.OpenRecordset("SELECT Id FROM table1", dbOpenSnapshot) 
    Set rs3 = DB.OpenRecordset("SELECT aId FROM table3", dbOpenSnapshot) 

    ' Main loop runs as long as there are records left in at least one source table 
    Do While Not (rs1.EOF And rs3.EOF) 
     ' Add new record in tResult 
     rsT.AddNew 

     ' For each source table: if not EOF, copy current value to target table and move to next record 
     If Not rs1.EOF Then 
      rsT!table1 = rs1!ID 
      rs1.MoveNext 
     End If 

     If Not rs3.EOF Then 
      rsT!table3 = rs3!aID 
      rs3.MoveNext 
     End If 

     rsT.Update 
    Loop 
    rsT.Close 

End Sub 
1

vous pouvez combiner toutes ces tables à l'aide de jointure externe complète (pour la logique MS Access diff en utilisant UNION) et exclure/gérer les valeurs NULL sur d'autres requêtes.

pour MS Access

SELECT t1.[id] table1,NULL table2,NULL table3,NULL table4 FROM table1 t1 UNION 
SELECT NULL table1,t2.[id] table2,NULL table3,NULL table4 FROM table2 t2 UNION 
SELECT NULL table1,NULL table2,t3.[aid] table3,NULL table4 FROM table3 t3 UNION 
SELECT NULL table1,NULL table2,NULL table3,t4.[bid] table4 FROM table4 t4 

Résultat:

table1 table2 table3 table4 
11  NULL NULL NULL 
32  NULL NULL NULL 
NULL 22  NULL NULL 
NULL 45  NULL NULL 
NULL NULL 1  NULL 
NULL NULL 5  NULL 
NULL NULL NULL 2 
NULL NULL NULL 7 

Je sais que ce n'est pas la solution exacte, mais il peut être utile.

Pour SQL Server, vous pouvez le faire de cette façon

SELECT t1.[id] table1 
    ,t2.[id] table2 
    ,t3.[aid] table3 
    ,t4.[bid] table4 
FROM table1 t1 
FULL OUTER JOIN table2 t2 ON t1.id = t2.id 
FULL OUTER JOIN table3 t3 ON t1.id = t3.aid 
FULL OUTER JOIN table4 t4 ON t1.id = t4.bid 

Mais cela produira également les valeurs NULL et doivent exclure/gérer ces valeurs NULL sur d'autres requêtes.

+3

MS Access prend-il en charge la jointure externe complète? IIRC no. – Arvo

+0

nous pouvons utiliser une autre logique (UNION) pour implémenter la jointure externe complète dans MS Access. Résultat modifié. Mais cela produira également les valeurs NULL et devra exclure/gérer ces valeurs NULL sur d'autres requêtes. Je sais que ce n'est pas la solution exacte, mais peut être utile. –