mysql - 如何根据另一个列值在查询中选择多个不同的列和连接?
问题描述
我在表 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
因为字段被添加到其他地方并且很难匹配相同数量的选定字段。
解决方案
您可以将所有LEFT JOIN
s 与当前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
推荐阅读
- r - 应用`group_by`函数时解释R中的平均值
- javascript - 如何使用 Javascript 添加 Input Type=Radio 值?
- google-maps - 添加带有图像层的 KML 层 - 未加载
- jquery - 将具有 addEventListener 和参数的箭头函数转换为常规 ES5 函数
- xml - 操作 XML 元素中的文本
- amazon-athena - 为什么雅典娜不从冰川(s3)存储中读取?
- java - Vaadin - Micronaut 集成
- javascript - 如何在不使用 Angular 的情况下启动新的 Ionic 4 应用程序?使用 Vue.js 或 Vanilla JS
- python - 如何创建一个包含列表中最大值的新列,该列表小于现有列中的单元格值?
- php - 登录页面重定向php