質問

昔の自由奔放な時代にまとめられた大量のデータベースを解析して、新しいスキーマを作成することに取り組んでいます。基本的には 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がアクセスされているどんなにます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top