MySQL で欠落しているカラムを処理する
-
22-09-2019 - |
質問
昔の自由奔放な時代にまとめられた大量のデータベースを解析して、新しいスキーマを作成することに取り組んでいます。基本的には 1 年に 1 つのデータベースであり、データベース名は foo98、foo99、foo2000 などになります。
最新の foo データについては、次のようなことができます。
SELECT foo_person.mdname AS middle_name,
...
FROM foo_person, foo_place, foo_thing
foo データベースの以前のバージョンに戻ると、ミドル ネームは保存されません。次のような一種のユニバーサルクエリを構築しようとしました。
SELECT IFNULL(foo_person.mdname, "") AS middle_name,
...
FROM foo_person, foo_place, foo_thing
しかし、MySQL は不明な列 foo_person.mdname について不平を言いますが、これは存在しないため、まったく合理的です。
MySQL 構文だけで存在しない列を処理する方法はありますか、それともデータベース固有のインポート クエリを作成する必要がありますか?
解決
あなたは、テーブルの名前を変更し、不足している列にその場所にビューを作成できますか?
わからない場合は、これはあなたが探しているものですが、私はそれを示唆するだろうと思っています。
-- 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;
他のヒント
(空の列ではなく)SQLに存在しない列を処理する任意の方法はありません。
あなたはそうのように、INFORMATION_SCHEMAテーブルを使用して、列があるかどうかを伝えることができます
select * from information_schema.columns
where table_name='mytable' and table_schema='mydatabase';
はい、方法はあります。
これらのデータベースについて考えてみましょう
- DB2009 には、Fname、MInitial、および LName を持つ person があります。
- DB2008 には Fname と LName を持つ person があります
- DB2007 には personName の person があります
次のようなことができます(これは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
は、私はとにかくデータベース固有のインポートのクエリを使用します。あなたは、など、いくつかの列に参加し、いくつかを削除する必要がある、といくつかを切り捨てることがあります。
代わりに、より複雑なSQLクエリを作成するのは、おそらくそれがより良いのだろう 不足している列に追加するfoo98とfoo99テーブルを変更ます。
は例えば、foo98に "mdname" と呼ばれるタイプVARCHAR(30)の列を追加する
ALTER TABLE foo98 ADD mdname varchar(30) AFTER first_name;
そして、あなたがリラックスして使用することができ、同じ単純なSQLクエリtabelがアクセスされているどんなにます。