分布式,在数学意义上是以下属性:
f(a + b) = f(a) + f(b)
现在我有了这个 SQL 脚本,它通常看起来像这样:
SELECT ... FROM ... LEFT JOIN (
Subquery_A
UNION ALL
Subquery_B
UNION ALL
...
UNION ALL Subquery_Z
)
查询是否数学分布?
也就是我能不能把它分解成
SELECT ... FROM ... LEFT JOIN (Subquery_A)
UNION ALL
SELECT ... FROM ... LEFT JOIN (Subquery_B)
UNION ALL
...
UNION ALL
SELECT ... FROM ... LEFT JOIN (Subquery_Z)
我问这个问题的原因是我有一个巨大的查询(13'000 多行),它经常超过公司数据库的最大连接生命周期。但是,将查询减少到仅 1 个子查询是有效的,并且在最大连接生命周期内很好。
因此,我想到了将这个庞大的查询拆分为许多单独的查询,并在客户端执行 UNION ALL
。 (因为 UNION ALL 是在简单连接子查询的结果之后)
你觉得这行得通吗?
最佳答案
不,这并不完全相同,因为每个子查询都会从左侧的表中获得完整的记录列表。您必须在任何子查询中消除与左侧表中的记录不匹配的多条记录。
假设您在表 1(左侧表)中有以下值:
ID
--
1
2
3
4
5
假设您有以下由 2 个子查询返回的值
Subquer1ID
--------
1
2
Subquer2ID
--------
1
3
4
使用第一个版本的sql你会得到
ID SubquerID FromSubquery
-- ---------- ----------
1 1 Subquer1
1 1 Subquer2
2 2 Subquer1
3 3 Subquer2
4 4 Subquer2
5 Null Null
对于第二个版本,结果集将是
ID SubquerID FromSubquery
-- ---------- ----------
1 1 Subquer1
2 2 Subquer1
3 Null Null
4 Null Null
5 Null Null
1 1 Subquer2
2 Null Null
3 3 Subquer2
4 4 Subquer2
5 Null Null
- 您必须删除重复的
ID - Null - Null
行 - 如果结果中有一行包含
ID - Non-null - Non-null
和Same Id - Null - Null
行,那么后面的行必须也被删除。
如果有一系列 SELECT ... FROM ... INNER JOIN (Subquery_A)
查询,然后是单个 SELECT ... FROM left_hand_side_table
语句,并将最后一个查询的结果与一系列内连接的结果相结合,以便将不在内连接中的任何记录放入最终结果集中。
关于mysql - SQL LEFT JOIN分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35597707/