有什么方法可以使用结果来指定要加入的表吗?
我想做类似的事情
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;