Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL优化-基于列值连接不同的表_Mysql_Sql_Optimization - Fatal编程技术网

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

Mysql SQL优化-基于列值连接不同的表,mysql,sql,optimization,Mysql,Sql,Optimization,我有一个表,其中包含一列作为“标志”,用于决定从哪个表中提取附加信息(即值1从表1提取,值2从表2提取,等等)。通常我只会使用索引/键连接表。然而,我可以连接的表包含的信息可以被规范化为单独的表,这让我不得不使用列来决定要连接哪个表 因此,我的问题是,基于此列中生成的值连接不同表的最有效方法是什么 以下是我目前知道的两种完成这项任务的方法。我很确定这两种方法都不是最佳解决方案: 从我的主表(包含决定加入哪个表的列值)中提取信息,然后通过应用程序中的代码发送其他查询以获取其余信息 疯狂地加入,返回

我有一个表,其中包含一列作为“标志”,用于决定从哪个表中提取附加信息(即值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);
    
    你可以

    当然也有局限性:

    • 列的数量是固定的,因此如果某些值应该忽略,则应选择
      NULL
      s
    • 你必须写一个
      案例。。。每列结束
    • 您应该提前知道所有连接的表
    • 性能可能不是最好的

    一旦我知道要使用哪一个表,每个表都有不同的列,除了我将用来连接表的键/索引。在这种情况下,我认为您必须进行多个查询,每个表一个查询。虽然可以从每个表中强制转换行,使它们都属于相同的类型吗?请注意,对于临时表,它们不能在mysqlshow中的子查询/联合中多次使用。第1点如何。但是,把它放在存储过程中,而不是应用程序代码中。谢谢你的回复,但这肯定不适用于我的情况。在这种情况下,每个表上的列都会不同,如其他表所述,左键连接其他表而不使用某些信息会立即破坏性能。