mysql - SQL LEFT JOIN分配?

标签 mysql sql

分布式,在数学意义上是以下属性:

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
  1. 您必须删除重复的 ID - Null - Null
  2. 如果结果中有一行包含 ID - Non-null - Non-nullSame 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/

相关文章:

mysql - 仅选择给定输入的最大 id

php - MySQL 大表管理?

MySql:索引表的所有字段以加速搜索查询

sql - 如何使用 Insert .. select,以及来自 insert 的条件变量

mysql - 解释的难以理解的响应以及如何决定在 mysql 中添加索引

sql - 在表格中显示约束

php - 使用一列中的 ORDER BY 显示 Mysql 数据库中的数据

php - 创建盲SQL注入(inject)漏洞

MySql 按范围内的营业时间和营业时间进行选择和分组

mysql - MySQL 中的更改数据捕获