Mysql SQL优化-基于列值连接不同的表
我有一个表,其中包含一列作为“标志”,用于决定从哪个表中提取附加信息(即值1从表1提取,值2从表2提取,等等)。通常我只会使用索引/键连接表。然而,我可以连接的表包含的信息可以被规范化为单独的表,这让我不得不使用列来决定要连接哪个表 因此,我的问题是,基于此列中生成的值连接不同表的最有效方法是什么 以下是我目前知道的两种完成这项任务的方法。我很确定这两种方法都不是最佳解决方案:Mysql SQL优化-基于列值连接不同的表,mysql,sql,optimization,Mysql,Sql,Optimization,我有一个表,其中包含一列作为“标志”,用于决定从哪个表中提取附加信息(即值1从表1提取,值2从表2提取,等等)。通常我只会使用索引/键连接表。然而,我可以连接的表包含的信息可以被规范化为单独的表,这让我不得不使用列来决定要连接哪个表 因此,我的问题是,基于此列中生成的值连接不同表的最有效方法是什么 以下是我目前知道的两种完成这项任务的方法。我很确定这两种方法都不是最佳解决方案: 从我的主表(包含决定加入哪个表的列值)中提取信息,然后通过应用程序中的代码发送其他查询以获取其余信息 疯狂地加入,返回
绝对不是选项2。如果您不需要数据,请不要检索它。简单。在不需要数据的情况下,在表(尤其是大型表)上进行连接将非常低效。您可以使用选项1或使用动态SQL来构建查询。然后,我将把一些测试用例放在一起,并运行执行计划,以查看查询的执行情况 根据其他表的内容,我建议使用UNION-每个查询返回的列必须相同。因此,您可以执行以下操作:
SELECT table1.title, tabel2.text FROM table1 INNER JOIN table2 ON table1.id=table2.id WHERE table1.key='2'
UNION
SELECT table1.title, tabel3.text FROM table1 INNER JOIN table3 ON table1.id=table3.id WHERE table1.key='3'
(调整SQL以确保它与您的模式匹配,并避免我添加的任何错误)我认为这是可能的:
create table a (id integer, flag boolean);
create table b (id integer, value_b varchar(30));
create table c (id integer, value_c varchar(30));
insert into a values (1, true), (2, false);
insert into b values (1, 'Val 1'), (2, 'Val 2');
insert into c values (1, 'C 1'), (2, 'C 2');
select a.id,
case when a.flag then b.value_b else c.value_c end AS value
from a
left join b using (id)
left join c using (id);
你可以
当然也有局限性:
- 列的数量是固定的,因此如果某些值应该忽略,则应选择
s李>NULL
- 你必须写一个
李>案例。。。每列结束
- 您应该提前知道所有连接的表李>
- 性能可能不是最好的