【发布时间】:2020-09-13 02:55:37
【问题描述】:
我的问题是关于如何优化和减小 sql 查询的大小。我想使用 UNION 加入 20 多个查询,它根据以下逻辑给了我正确的结果,但我在这里寻找两件事
-
更高效的方法
-
我的查询中已经有 20 个 UNION,并且每个月我都必须添加 2-4 个 UNION,这使得这个查询很长,所以有什么办法可以用更少的代码来改写这个查询
Select '343' As 'Manual ID', '24/07/2020' As 'Date', A.ID, O.Order_Name, C.Customer_Name, Q.Quantity From Shipper A Left Join Order O A.ID = O.ID Left Join Customer C A.ID = C.ID Left Join Quantity Q Q.ID = C.ID where A.ID IN (1) UNION Select '323' As 'Manual ID', '24/08/2020' As 'Date', A.ID, O.Order_Name, C.Customer_Name, Q.Quantity From Shipper A Left Join Order O A.ID = O.ID Left Join Customer C A.ID = C.ID Left Join Quantity Q Q.ID = C.ID where A.ID IN(2,3,4)等等……
结果
Manual ID | Date | Shipper | Order Name | Customer Name | Qty
343 | 24/07/2020 | 1 | order1 | A | 5
323 | 24/08/2020 | 2 | order2 | B | 2
323 | 24/08/2020 | 3 | order3 | C | 1
323 | 24/08/2020 | 4 | order4 | D | 12
【问题讨论】:
-
除了建议所有涉及的表的
ID列上都有索引之外,我没有看到任何明显的方法可以使联合更快。也就是说,我建议您尝试优化单个查询,如果您还没有这样做的话。 -
感谢您的快速响应,每当添加新的托运人时,我都必须从 UNION 复制。我有 20 多个 UNION,这使查询变得很长,并且每周添加 1 或 2 个 UNION,任何建议如何改写此查询
-
样本数据、您期望从该数据中获得的输出以及对您要解决的问题的更清晰解释会有所帮助。
-
由于每个联合之间的唯一变量似乎是
Manual ID、Date和A.ID,因此您可以制作一个报告表,其中每一行都是这些变体之一。然后创建一个查询,该查询选择所有报告表行并输出由最终 SQL 查询组成的字符串。这不会使最终查询更加高效,但它会使创建查询的过程更加高效。 -
您如何定义手动 id,日期是针对特定托运人 id 的?在您的示例中,发货人 ID 1 的日期为 2020 年 7 月 24 日,手动 ID 为 343。您是如何得出这个的?
标签: mysql sql left-join union toad