首页 > 解决方案 > UNION ALL 的替代方案,用于 2 个表,每个表都有硬编码值

问题描述

在不使用下面的 UNION ALL的情况下,是否有替代查询?我有 2 个使用 UNION ALL 连接在一起的查询,但每个查询都有一个硬编码值来区分两者之间的行。

“D”表示该行是否来自“存款”表,“W”表示该行是否来自“取款”表

我使用,它缺乏表达 UNION 或 UNION ALL 的本地方式。

SELECT user_id, deposit.amount as Amount, YEAR(date_created) as Year, MONTHNAME(date_created) as Month, 'D' As 'Type' FROM deposit
UNION ALL
SELECT user_id, withdrawal.amount as Amount, YEAR(date_created) as Year, MONTHNAME(date_created), 'W' FROM withdrawal 

到目前为止,这是我的预期输出:

用户身份 数量 类型
1 200 七月 2021 D
2 100 八月 2021 W

标签: mysqltypeorm

解决方案


您的数据库有用于存款和取款的单独表格,并且您试图从这些表格中显示详细的(逐行)数据,就好像它们是一张表格一样。 SQL 处理行集,您的要求是提供一个集合,即两个表的并集。

在 SQL 中,UNION ALL 就是您这样做的方式。UNION ALL 的某些用途是无端的废话,但您的使用是正确的。

如果您需要将这些表作为一个表来呈现,以便应用程序(例如基于 TypeORM 的应用程序)可以使用它们,请创建一个视图。对你的 MySQL 客户端程序说这样的话。这就像定义一个表,你只需要做一次。

CREATE OR REPLACE VIEW ledger AS
SELECT user_id, deposit.amount as Amount, 
       YEAR(date_created) as Year, MONTHNAME(date_created) as Month, 
       'D' As 'Type' FROM deposit
UNION ALL
SELECT user_id, withdrawal.amount as Amount, 
       YEAR(date_created) as Year, MONTHNAME(date_created), 
       'W' FROM withdrawal; 

然后,在 TypeORM 中,您可以像引用ledger表格一样引用它。您将无法插入或更新它,但可以从中选择数据。

不要太担心性能。MySQL 的查询计划器非常聪明,可以有效地访问这种视图。


推荐阅读