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?
Répondre
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
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.
MS Access prend-il en charge la jointure externe complète? IIRC no. – Arvo
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. –
Ceci est très difficile à faire dans MS Access. –
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
Ce serait facile avec une boucle d'enregistrements VBA. Mais est-ce que les 4 tables ont le même nombre de lignes? – Andre