首页 > 解决方案 > 如何根据另一个列值在查询中选择多个不同的列和连接?

问题描述

我在表 A 上有一个非常复杂的请求,其中 aJOIN是在另一个表 B 和 C 上进行的(实际上还有更多)。

我希望在表 A 中某个字段的特定值上,将字段添加到SELECT不同的连接中。

我知道我可以使用 动态添加列CASE,但测试值始终相同,并且我想避免CASE为每个字段重复 a,因为字段很多。(为了清楚起见,我将表命名为“B”和“D”,CASE但在实际情况下,它可能与连接别名相同)

SELECT
  CASE
    WHEN A.a1=1 THEN B.b1
    WHEN A.a1=2 THEN D.d1
  END AS a2,
  CASE
    WHEN A.a1=1 THEN B.b2
    WHEN A.a1=2 THEN D.d2
  END AS a3,
  CASE
    WHEN A.a1=1 THEN B.b2
    WHEN A.a1=2 THEN D.d2
  END AS a3,
  //... many others on different tables but always on the same condition
FROM A
  JOIN //?? if first condition join on B and C else on D and E

是否有动态加入并避免长时间重复CASE通话的解决方案?

注意:这只是用代码构建的查询的一部分,这使得它难以使用,UNION因为字段被添加到其他地方并且很难匹配相同数量的选定字段。

标签: mysqljoin

解决方案


您可以将所有LEFT JOINs 与当前CASE条件一起用作 the 的一部分,ON然后COALESCE是这些表的值。就像是:

      SELECT COALESCE(B.b1,D.d1) AS a2,
             COALESCE(B.b2,D.d2) AS a3,
             COALESCE(B.b3,D.d3) AS a4,
             ...
        FROM A
   LEFT JOIN B ON {normal_join_condition} AND A.a1 = 1
   LEFT JOIN C ON {normal_join_condition} AND A.a1 = 1
   LEFT JOIN D ON {normal_join_condition} AND A.a1 = 2
   LEFT JOIN E ON {normal_join_condition} AND A.a1 = 2

推荐阅读