5

我有一个表,其中包含一个充当“标志”的列,用于决定从哪个表中提取附加信息(即值 1 从 table1 中提取,2 从 table2 中提取,等等)。通常我会使用索引/键加入表。但是,我可以加入的表包含的信息可以规范化为单独的表,这让我不得不使用列来决定要加入哪个表。

所以这是我的问题,根据此列中产生的值连接不同表的最有效方法是什么?

以下是我目前知道如何完成此任务的两种方法。我很确定它们都不是最佳解决方案:

  1. 从我的主表中提取信息(包含决定加入哪个表的列值),然后通过我的应用程序中的代码发送额外的查询以获取其余信息。

  2. 疯狂加入,返回每个表的列(即使未使用)。然后,通过我的代码,忽略不需要的表的空值。

4

3 回答 3

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如果应该省略某些值,你应该选择 s;
  • 你必须CASE ... END为每一列写一个;
  • 你应该提前知道所有连接的表;
  • 性能可能不是最好的。
于 2012-05-08T19:37:11.197 回答
1

绝对不是选项 2。如果您不需要数据,请不要检索它。简单的。当您不需要数据时,加入表(尤其是大表)将非常低效。您可以使用选项 1 或使用动态 SQL 来构建查询。然后我会将一些测试用例放在一起并运行执行计划以查看查询的执行情况。

于 2012-05-08T04:31:32.947 回答
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 以确保它与您的架构匹配,并且确实避免了我添加的任何错误)

于 2012-05-08T04:32:50.433 回答