这是示例:
SELECT <columns>
FROM (..........<subquery>..........) AS xxx
INNER JOIN(s) with xxx.............
LEFT OUTER JOIN(s) with xxx........
WHERE <filter conditions>
如果我错了,请纠正我:
- 那
<subquery>
是派生表吗? - 如果它返回关于服务器内存的太多数据(比如数百万行)是否有问题,因为我知道 WHERE 子句应用于最终结果集并且即使最终结果有 10 个子查询也让服务器处理太多子查询行?
- 如果没有内连接(以减少数据)并且只有左外连接怎么办,这是否会使事情变得更糟/更慢,因为它必须与子查询中的所有行进行连接?
- 如果(2)是一个问题,那么我想到的一种解决方案是通过在其中添加其他联接来限制子查询返回的数据,这会使事情变慢(我已经尝试过了)。对此还有其他想法吗?
- 如果由于 where 子句依赖于子查询之后的连接,我无法限制子查询的结果怎么办?
- 为了澄清事情,子查询返回太多数据的原因是因为我正在尝试使用 UNION ALL 组合来自多个表的数据(没有过滤条件),然后,对于子查询返回的每一行,加入以获取我的信息需要在 WHERE 子句中使用它。另一种方法是对子查询内部的每个 UNION ALL 执行您在子查询外部看到的所有连接,是的,这确实限制了结果集,但会产生更多连接,正如我所说,这会减慢速度。换句话说,我必须在执行此操作的子查询之间进行选择:
(
SELECT * FROM A UNION ALL
SELECT * FROM B UNION ALL
SELECT * FROM C...
) AS xxx
left outer join T with xxx
和
SELECT * FROM A
LEFT OUTER JOIN T ...
WHERE....
UNION ALL
SELECT * FROM B
LEFT OUTER JOIN T ...
WHERE....
UNION ALL
SELECT * FROM C
LEFT OUTER JOIN T ...
WHERE....