SQL LEFT JOIN分配?

时间:2016-02-24 09:09:29

标签: 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 个答案:

答案 0 :(得分:2)

不,它并不完全相同,因为每个子查询都会有左侧表格中的完整记录列表。您必须在任何子查询的左侧表中删除与记录不匹配的多个记录。

假设你在table1(左侧表)中有以下值:

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-null行和Same Id - Null - Null行,则必须删除后者。
  3. 使用一系列SELECT ... FROM ... INNER JOIN (Subquery_A)查询,然后单个SELECT ... FROM left_hand_side_table语句并将最后一个查询的结果与内部联接系列的结果组合起来要容易得多,所以任何不在内部联接中的记录都放在最终结果集中。