mysql - UNION ALL 的替代方案,用于 2 个表,每个表都有硬编码值
问题描述
在不使用下面的 UNION ALL的情况下,是否有替代查询?我有 2 个使用 UNION ALL 连接在一起的查询,但每个查询都有一个硬编码值来区分两者之间的行。
“D”表示该行是否来自“存款”表,“W”表示该行是否来自“取款”表
我使用typeorm,它缺乏表达 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 |
解决方案
您的数据库有用于存款和取款的单独表格,并且您试图从这些表格中显示详细的(逐行)数据,就好像它们是一张表格一样。 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 的查询计划器非常聪明,可以有效地访问这种视图。
推荐阅读
- windows - 如何正确编写 Invoke-Expression 命令以根据配置文件值构建变量值
- ms-access - Microsoft Access 中的“排序依据”和“排序依据”有什么区别
- laravel - Laravel Azure 应用服务删除方法不允许
- wordpress - 减少 Wordpress 主题中的背景
- typescript - 导致对 .d.ts 文件的引用的 import 语句不再起作用
- node.js - Sequelize 原始查询未正确打印
- node.js - 尝试上传图片,但我的 multer 未定义 req.file
- c# - Url.RouteUrl 在 ASP.NET Core 3.0 中为空白
- c++ - operator<< 的全局重载不起作用,为什么?
- windows - 将文本文件中的字符串提取到另一个文本文件中?在 .bat 中