如何根据另一个列值选择多个不同的列和查询中的联接?

时间:2019-05-21 14:42:27

标签: mysql join

我在表A上有一个非常复杂的请求,其中在另一个表B和C(实际上还有更多)上进行了self.data = self.spark.read.csv(path=self.input_file,header=True, schema=self.schema)

我希望在表A中某个字段的特定值上,将字段添加到JOIN中,但还要添加不同的联接。

我知道我可以使用SELECT动态添加列,但是测试值始终相同,并且我想避免对每个字段重复使用CASE,因为有很多字段。 (为清楚起见,我在CASE中将表分别命名为“ 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变得困难,因为字段被添加到其他位置,并且很难匹配相同数量的所选字段。

1 个答案:

答案 0 :(得分:1)

您可以在当前LEFT JOIN条件下使用所有CASE作为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