2009-12-05 6 views
1

Nous avons fichier .mdb avec des centaines de tables: lesson1, Lesson2, lesson3, Lesson4, etc. Toutes les tables ont la même structure:Choisissez parmi des centaines de tables à la fois (.mdb)

Lesson<n> 
---------------- 
slide_id 
name 
description 
status 
created_date 
created_by 
updated_date 
updated_by 

Qu'est-ce que SQL déclaration générerait un résultat comme celui-ci:

| table_name | slide_id | name       | 
|-----------------------|-------------------------------| 
| Lesson1 | 1  | name for slide 1 of lesson 1 | 
| Lesson1 | 2  | name for slide 2 of lesson 1 | 
| Lesson2 | 1  | name for slide 1 of lesson 2 | 
| Lesson2 | 2  | whatever      | 
| Lesson2 | 3  | again whatever    | 

etc.

donc, il y a quelques points ici:

  1. noms de table doivent être inclus
  2. il y a des centaines de tables
+1

Comme les états richardtalent consolident les tables. À présent. Plus de travail que vous dépensez avec des tables individuelles est une perte de temps. –

Répondre

5

Si les noms de table sont connus, vous pouvez créer une requête comme:

SELECT 'Lesson1' AS table_name, slide_id, name, ... FROM Lesson1 
UNION ALL SELECT 'Lesson2', slide_id, name, ... FROM Lesson2 
UNION ALL SELECT 'Lesson3', slide_id, name, ... FROM Lesson3 
UNION ALL SELECT 'Lesson4', slide_id, name, ... FROM Lesson4 
UNION ALL SELECT 'Lesson5', slide_id, name, ... FROM Lesson5 

Curseurs ne sont nécessaires que si le nombre de tables est en pleine mutation constante. Sinon, cela devrait faire l'affaire. Conseil: pour générer la requête initiale, collez les noms de la table dans Excel et utilisez une formule dans la cellule suivante pour créer l'instruction "UNION ALL" de cette table. Ensuite, copiez et collez directement dans Access. (Ou créer dynamiquement en utilisant un curseur, mais copier/coller et une formule rapide est facile, et vous pouvez enregistrer le fichier Excel juste au cas où vous devez ajouter des tables en vrac, modifier les colonnes sélectionnées, etc.)

Et, évidemment, la solution finale devrait consister à consolider les tables, si possible, et à ajouter un champ de discriminateur lors de l'interrogation. Heck, si vous devez, il est plus facile de gérer des centaines de requêtes qui tirent chacune des lignes d'une leçon (Excel peut être un outil de mise à jour par lots pratique), que des centaines de tables de leçons qui doivent avoir des structures identiques.

+0

+1 pour consolider les tables. Pensez à faire cela maintenant, plutôt que de perdre du temps à résoudre un problème qui serait trivial quand vous l'avez fait. – blackanchorage

+0

@richardtallent, merci! Cela a fonctionné comme par magie! – Nuku

0

utilisant le serveur sql, je ne peux malheureusement voir ce que fait avec un curseur X- (.

Cela devrait aider

DECLARE @Name VARCHAR(50) 
DECLARE Cur CURSOR FOR 
SELECT name 
FROM sysobjects 
WHERE xtype = 'U' 
and  name like 'Lesson%' 

OPEN Cur 
FETCH NEXT FROM Cur INTO @Name 

DECLARE @RetTable TABLE(
     TableName VARCHAR(50), 
     slide_id INT, 
     name VARCHAR(100) 
) 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    INSERT INTO @RetTable EXEC ('SELECT ''' + @Name + ''',slide_id , Name FROM ' + @Name) 
    FETCH NEXT FROM Cur INTO @Name 
END 

CLOSE Cur 
DEALLOCATE Cur 

SELECT * 
FROm @RetTable 

OK, alors si vous pouvez utiliser un code de macro/vba vous pouvez créer une table temporaire appelée AllLessons et exécutez le code suivant. J'ai testé cela à partir d'un formulaire avec un bouton.

Private Sub Command0_Click() 
Dim iTable As Integer 
    For iTable = 0 To CurrentDb.TableDefs.Count - 1 
     Dim tableName As String 
     tableName = CurrentDb.TableDefs(iTable).Name 
     If (Left(tableName, Len("Lesson")) = "Lesson") Then 
      CurrentDb.Execute "INSERT INTO AllLessons ([table_name],[slide_id],[name]) SELECT """ & tableName & """, [slide_id],[name] FROM " & tableName 
     End If 
    Next iTable 
End Sub 
+0

Malheureusement, nous n'avons pas de serveur SQL. Savez-vous si cela peut être fait en utilisant Ms Access ou MySQL? Ce code peut-il être exécuté sur Ms Access? – Nuku

+0

Votre tag dit serveur sql, mais je vais chercher un accès ms –

+0

J'espérais une instruction sql qui était générique et ne voulait pas se rétrécir. Merci. – Nuku

Questions connexes