【问题标题】:Execute Join in If statement在 If 语句中执行 Join
【发布时间】:2021-11-14 07:42:30
【问题描述】:

我想在 mysql 中加入来自同一数据库中不同表的一堆列。我遇到的问题是,并非所有值都写在同一个表中。 具体示例:在一个表中有 sid 列。根据此列中的值,我在此连接中需要的下一个值位于不同的表中。如果 sid 值等于 1,我必须加入表 2 以获得我想要的值,如果 sid 值不是 1,我必须加入表 3。 我在 mysql 中对 if - else 进行了一些研究,但我能找到的所有信息都是关于更改值以及它们在特定条件下如何显示的信息。 我希望工作流程在特定条件下发生变化。

无论执行哪个连接,生成的表都具有相同数量的列。我实际上并没有显示表 2 和表 3 中的任何数据。 descr 列存在于表 4 中。所有其他显示的列都存在于表 1 中。因此显示应该没有任何问题。

代码如下(受python启发):

SELECT type, s_type, id, descr
FROM table1
IF sid = 1 THEN
    LEFT JOIN table2
    ON table1.sid = table2.sid
    LEFT JOIN table4
    ON table2.sid = table4.id_name
ELSE
    LEFT JOIN table3
    ON table1.sid = table3.svid
    LEFT JOIN table4
    ON table3.svid = table4.id_name
END IF;

在 mysql 中完成此控制流的正确方法是什么?

【问题讨论】:

  • 请限定列名,以便清楚它们的来源。
  • 执行与适当表连接的单独查询,并将它们与UNION结合起来。

标签: mysql sql mysql-workbench


【解决方案1】:

IF 在 SQL 中不能被 this 使用。如果我理解其中的逻辑,您可以执行以下操作:

SELECT type, s_type, id, table4.descr
FROM table1 LEFT JOIN
     table2
     ON table1.sid = table2.sid AND table1.sid = 1 LEFT JOIN
     table3
     ON table1.sid = table3.svid AND table1.side <> 1 LEFT JOIN
     table4
     ON table4.id_name = COALESCE(table3.svid, table2.sid)

如果您的表很大,COALESCE() 可能会成为性能杀手。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    相关资源
    最近更新 更多