結合するテーブルを指定するために結果を使用する方法はありますか?
次のようなことをしたい
SELECT id, some_number, ... FROM sometable NATURAL JOIN someothertable_$some_number;
関係代数ではこのようなことは何もないことを私は知っているので、おそらく私は成功しないでしょう。念のために尋ねたかっただけです。
SQL スクリプトを使用したくありません。
結合するテーブルを指定するために結果を使用する方法はありますか?
次のようなことをしたい
SELECT id, some_number, ... FROM sometable NATURAL JOIN someothertable_$some_number;
関係代数ではこのようなことは何もないことを私は知っているので、おそらく私は成功しないでしょう。念のために尋ねたかっただけです。
SQL スクリプトを使用したくありません。
実行可能な例: http://sqlfiddle.com/#!2/5e92c/36
この例のテーブルをセットアップするコード:
create table if not exists someTable
(
someTableId bigint not null auto_increment
, tableId int not null
, someOtherTableId bigint not null
, primary key (someTableId)
, index (tableId, someOtherTableId)
);
create table if not exists someOtherTable_$1
(
someOtherTableId bigint not null auto_increment
, data varchar(128) character set utf8
, primary key (someOtherTableId)
);
create table if not exists someOtherTable_$2
(
someOtherTableId bigint not null auto_increment
, data varchar(128) character set utf8
, primary key (someOtherTableId)
);
insert sometable (tableId, someOtherTableId) values (1, 1);
insert sometable (tableId, someOtherTableId) values (1, 2);
insert sometable (tableId, someOtherTableId) values (2, 2);
insert sometable (tableId, someOtherTableId) values (2, 3);
insert someothertable_$1(data) values ('table 1 row 1');
insert someothertable_$1(data) values ('table 1 row 2');
insert someothertable_$1(data) values ('table 1 row 3');
insert someothertable_$2(data) values ('table 1 row 1');
insert someothertable_$2(data) values ('table 1 row 2');
insert someothertable_$2(data) values ('table 1 row 3');
静電気対策
テーブルが修正されている場合の解決策は次のとおりです (たとえば、この例では someOtherTable 1 と 2 しかありません / 新しいテーブルが追加されたときにコードを自動的に変更する必要はありません)。
select st.someTableId
, coalesce(sot1.data, sot2.data)
from someTable st
left outer join someOtherTable_$1 sot1
on st.tableId = 1
and st.someOtherTableId = sot1.someOtherTableId
left outer join someOtherTable_$2 sot2
on st.tableId = 2
and st.someOtherTableId = sot2.someOtherTableId;
動的ソリューション
実行時にテーブルの数が変わる可能性がある場合は、動的 SQL を記述する必要があります。注意: 連続するすべてのテーブルで、パフォーマンス ヒットが発生します。これは本番システムにはお勧めしません。しかし、それは楽しい挑戦です。ツールセットと達成したいことを説明していただければ、より適切な方法についていくつかのヒントを提供できるかもしれません.
select group_concat(distinct ' sot' , cast(tableId as char) , '.data ')
into @coalesceCols
from someTable;
select group_concat(distinct ' left outer join someOtherTable_$', cast(tableId as char), ' sot', cast(tableId as char), ' on st.tableId = ', cast(tableId as char), ' and st.someOtherTableId = sot', cast(tableId as char), '.someOtherTableId ' separator '')
into @tableJoins
from someTable;
set @sql = concat('select someTableId, coalesce(', @coalesceCols ,') from someTable st', @tableJoins);
prepare stmt from @sql;
execute stmt;