1

mysql データベースのすべてのテーブルに存在する「name」という名前の列があります。

すべてのテーブルのすべての名前をリストしたかったので、次のクエリを使用しました

select name from (SELECT table_name FROM information_schema.tables WHERE table_type='BASE TABLE') as abc

しかし、それはうまくいきませんでした。代わりに、table_name 列だけが返されました。

次に、ショーテーブルを使用し、出力をtable_listという別のテーブルに保存してから、次のクエリを実行しました

select name from (select table_name from table_list) as abc

これも同じ結果、つまりすべてのテーブル名を返しました。

私が間違っていることと、それを行う正しい方法は何かを知ることができますか?

私は MySQL 5.4 を使用しており、サブクエリ、プロシージャ、または関数を純粋に mysql で記述したいと考えています。

4

2 に答える 2

1

必要なのは、SQLで変数を使用する方法です(つまり、と言うことができますselect * from $name where $name in (select ...))。SQLはそれを許可していません。

私の提案は、プロセスを分割することです。

最初にこのクエリを実行します。

select 'select distinct name from ' || table_name || ' union'
from select table_name from table_list

それはあなたに実行するための選択を与えるでしょう。それらを小さなスクリプトに入れ、最後の「ユニオン」を削除して、そのスクリプトを実行します。

[編集]MySQLがストアドプロシージャで「eval」演算子をサポートしている場合(つまり、パーツからSQLをビルドして実行できる場合)、これを行うことができます。ドキュメントを確認しましたが、評価があるようには見えません。ルックアップまたは「eval」関数を実装する拡張機能をCで作成することもできます(第22章を参照)。

しかし、私の推測では、データベースは常に変更されるわけではありません。したがって、最も簡単な解決策は、ビューのコードを作成する小さなSQLスクリプトを作成することです(つまり、文字列です。実際にはビューは作成されません)。DBが変更されるたびに、スクリプトを実行してビューを再作成し、その後、ビューに対してクエリを実行して、すべての名前のリストを取得できます。

于 2009-07-22T08:50:23.153 に答える