2009-10-20 8 views
0

Travail sur l'analyse d'un ensemble de bases de données assemblées dans un ancien temps plus libre dans un nouveau schéma. Fondamentalement, il est une base de données par an, avec des noms de base de données comme foo98, foo99, foo2000, etc.Gestion des colonnes manquantes dans MySQL

Donc, pour les données les plus récentes foo, je peux faire quelque chose comme

SELECT foo_person.mdname AS middle_name, 
... 
FROM foo_person, foo_place, foo_thing 

Comme vous revenez dans les versions antérieures de la base de données foo, le deuxième prénom n'est pas stocké. J'ai essayé de construire une sorte de recherche universelle, quelque chose comme:

SELECT IFNULL(foo_person.mdname, "") AS middle_name, 
... 
FROM foo_person, foo_place, foo_thing 

mais MySQL se plaint de foo_person.mdname colonne inconnue, ce qui est tout à fait raisonnable, car elle n'existe pas.

Existe-t-il un moyen de gérer des colonnes inexistantes avec seulement la syntaxe MySQL, ou devrais-je écrire des requêtes d'importation spécifiques à la base de données?

Répondre

1

Pourriez-vous renommer les tables et créer des vues à leur place avec les colonnes manquantes?

Je ne sais pas si c'est ce que vous cherchez, mais j'ai pensé que je le suggérerais.

-- Here is your original table 
create table t (fname varchar(30), lname varchar(30)); 

-- Rename it to something else 
alter table t rename to tOrig; 

-- Create a view with the columns its missing that you need 
create view t as select fname, lname, '' as mname from tOrig; 
+0

Oui, en fait, cela fonctionne plutôt bien. Ce sont de vieilles bases de données et la seule chose dont je peux être sûr, c'est que rien ne les désigne plus. Merci pour la pensée latérale. – Glazius

+0

Pas de problème. Je suis content que ça a marché pour vous. –

0

Si vous travaillez avec des bases de données hétérogènes, j'utiliserais de toute façon des requêtes d'importation spécifiques à la base de données. Vous devrez peut-être joindre des colonnes et en supprimer, en tronquer certaines, etc.

2

Il n'existe aucun moyen de gérer une colonne inexistante en SQL (par opposition à une colonne vide).

Vous pouvez dire si la colonne est là ou non en utilisant les tables de information_schema, comme ceci:

select * from information_schema.columns 
    where table_name='mytable' and table_schema='mydatabase'; 
2

Oui, il y a un chemin.

Considérons ces bases de données

  • DB2009 a personne Fname, Minitial et LName
  • DB2008 a personne FNAME et LName
  • DB2007 a personne NomPersonne

Vous pouvez faire quelque chose de similaire à ce qui suit (j'ai écrit ceci pour MS SQL Server)

/*all three columns exist*/ 
SELECT FName, MInitial, LName 
From DB2009.Person 

UNION 

/*one column is a forced null */ 
SELECT FName, NULL as MInitial, LName 
From DB2008.Person 

UNION 

/*two columns are derived and one column is a forced null */ 
SELECT SubString (1, CharIndex (PersonName, ' '), PersonName) as FirstName, 
     NULL as MInitial, 
     SubString (CharIndex (PersonName, ' '), len (PersonName), PersonName), 
From DB2007.Person 
0

Au lieu de faire des requêtes SQL plus complexes, il serait peut-être préférable de modifier la foo98 et foo99 tables d'ajouter dans les colonnes manquantes.

Par exemple, pour ajouter une colonne de type varchar (30) appelé « mdname » à foo98:

ALTER TABLE foo98 ADD mdname varchar(30) AFTER first_name; 

Ensuite, vous pouvez vous détendre et utiliser la même requête simple SQL, quel que soit tabel est en cours d'accès.

Questions connexes