SQL优化 - 基于列值连接不同的表

5
我有一张表格,其中包含一个用作“标志”的列,该列用于决定从哪个表中提取其他信息(即值1从表1中提取,2从表2中提取等)。通常我会使用索引/键连接表格。然而,我可以加入的表格包含可以规范化到单独的表格中的信息,这使我处于使用列来决定要加入哪个表格的情况下。
那么,我的问题是,基于在此列中产生的值,连接不同表格的最有效方法是什么?
以下是我目前知道如何完成此任务的两种方法。我相当确定它们都不是最佳解决方案:
1. 从我的主表中提取信息(包含决定要加入哪个表格的列值),然后通过应用程序中的代码发送其他查询以获取其余信息。 2. 进行连接操作并返回每个表格的列(即使未使用)。然后,通过我的代码忽略不需要的表格的空值。

2
点1怎么样?但是,把它放在存储过程中而不是应用程序代码中。 - bitoshi.n
3个回答

1

根据其他数据表的内容,我建议使用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以确保它与您的架构匹配,为了避免任何错误,我已经添加了一些内容。

每个表格都有不同的列,除了我将用于连接表格的键/索引之外,一旦我知道要使用哪个表格。 - user1110302
在这种情况下,我认为您需要进行多个查询,每个表格一个。不过,将每个表格的行转换为相同类型是否可能通过 CAST 实现? - andrewsi
请注意,在MySQL中,使用临时表时不能在子查询/联合中多次使用。 - tipu

1

绝对不是选项2。如果您不需要数据,请不要检索它。很简单。当您不需要数据时,连接表格(特别是大型表格)会非常低效。您可以选择选项1或使用动态SQL来构建查询。然后,我会编写一些测试用例并运行执行计划,以查看查询的性能如何。


1

我认为这是可能的:

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);

您可以尝试一下

当然,也有一些限制:

  • 列数是固定的,因此如果要省略某些值,应该使用NULL
  • 每个列都需要编写一个CASE ... END
  • 您需要提前了解所有连接的表;
  • 性能可能不是最佳的。

谢谢回复,但这对我的情况肯定行不通。在这种情况下,每个表的列都将不同,并且正如其他人提到的那样,左连接其他表并不使用某些信息会立即破坏性能。 - user1110302

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接