どんなクエリに複数のSQLテーブルの特定のキー-値ペア?
-
01-07-2019 - |
質問
状況:PHPアプリを複数設置可能モジュールを作成し、新しいテーブルデータベースにそれぞれのスタイルのmod_A,mod_B,mod_C。それぞれのカラムsection_id.
現在、すべての作品は特定のsection_id、今度は内容が別の方法のほか"Select*from mod_a,mod_b,mod_c...mod_xyzzyがsection_id=値"...またはさらに悪化した場合は、別のクエリの各モジュールです。
解決
の場合はテーブルが変化する時間をできるインラインコードの世代のソリューション、SP(擬似コード-ょく):
SET @sql = ''
DECLARE CURSOR FOR
SELECT t.[name] AS TABLE_NAME
FROM sys.tables t
WHERE t.[name] LIKE 'SOME_PATTERN_TO_IDENTIFY_THE_TABLES'
--こ
DECLARE CURSOR FOR
SELECT t.[name] AS TABLE_NAME
FROM TABLE_OF_TABLES_TO_SEACRH t
START LOOP
IF @sql <> '' SET @sql = @sql + 'UNION ALL '
SET @sql = 'SELECT * FROM [' + @TABLE_NAME + '] WHERE section_id=value '
END LOOP
EXEC(@sql)
に使用しましたこの技術により、がん、明らかな方法で、将来もなく動的SQL.
注意:ごループが使用でき合体/NULLの伝播トリックの文字列としてNULL以前のループがないとして明確な場合に慣れていないのム:
SET @sql = COALESCE(@sql + ' UNION ALL ', '')
+ 'SELECT * FROM [' + @TABLE_NAME + '] WHERE section_id=value '
他のヒント
何ですか?
SELECT * FROM mod_a WHERE section_id=value
UNION ALL
SELECT * FROM mod_b WHERE section_id=value
UNION ALL
SELECT * FROM mod_c WHERE section_id=value
私たします。
も必要なものめます。ればすべてが同じ構造をしてみてはいかがでしょうか一つに"修士"モジュールのテーブルが追加につ新しい列の識別のモジュール("A","B","C",....)
の場合のモジュールのテーブルはほぼ同じですが、お持ちの複数カラムすることができるものを統合すべてに共通の情報を一つのテーブル、小さなモジュール固有のテーブルとの違いがある。そのような場合でも、joinを構成します。
この提案は、お問い合せのカラムsection_idを大きには超臨界を見ています。一つのクエリの共通情報を、第二期しています特定の情報要望の受け入れが大変良いと思います。(ない場合がございます--例えばだいたいを検証するためexistenseのセクションでの共通テーブルにおいてどのように)
また加えることができるテーブルマップsection_idのモジュールです。
section_id | module -----------+------- 1 | A 2 | B 3 | A ... | ...
これは意味がしておいて二つのクエリは、このマッピングテーブルを別のモジュールのテーブルを引き出せます。
ウンターまでお問合わせくださいこのテーブルの他の列と指標にそのカラムが必要な場合にその他のカラムに共通するすべてのモジュールです。
この方法は、明確なdisadvanageのデータが重複しています。
おそらくいくつかの追加の詳細情報ば、その音のように解決済みです。いまから選択するとすべてのテーブルとsection_id.を使用できる接合の代わりにテーブルのリストで接合にsection_id.例えば、
select a.some_field, b.some_field....
from mod_a a
inner join mod_b b on a.section_id = b.section_id
...
where a.section_id = <parameter>
このままパッケージこのとします。また通知のリストの代わりに、私のお勧めしまう実際に使用*.
それだけ多くの方に情報を集約する複数のテーブル.ご参加いただけますようにお考えできる複数のクエリーとユニオンとしてborjabの答えです。わからない場合というテーブル交差するすべてのモジュールのテーブルが役立つであろう、まだsection_idしたテーブルのように使うことができるものからのシングルモードです。その他、私は拍手をお過去半年のものが怖いと思いますかせる仕事eaiser:)
していましたら、同じように考えていborjab.唯一の問題はまれている方にぴったりの更新にこれらすべてのクエリを追加した場合、別表に示す。のその他のオプションを見で保存されている。
かったので思いの他のオプションここでは、少なくともできる存在です。を利用することも可能ですビューはこれらの複数のテーブルに表示され一つとして、そしてクエリのようにクリーナー、にわかりやすくなって書き換えに長連合のクエリがやってみたかったその他のクエリがこれらの複数のテーブル.
SELECT * FROM (
SELECT * FROM table1
UNION ALL
SELECT * FROM table2
UNION ALL
SELECT * FROM table3
) subQry
WHERE field=value
オプションからデータベースに面するビューを作成する連合(EU)のすべての種々のテーブル追加された場合は定義しなければいけませんように追加する必要がありその眺望がないようにする。
CREATE VIEW modules AS (
SELECT * FROM mod_A
UNION ALL
SELECT * FROM mod_B
UNION ALL
SELECT * FROM mod_C
);
select * from modules where section_id=value;