我有一个表,我们称之为"a",它在一个涉及大量表的视图中的左连接中使用.但是,如果它们也与另一个表"b"连接,我只想返回"a"行.所以现有代码看起来像
SELECT ....
FROM main ...
...
LEFT JOIN a ON (main.col2 = a.col2)
Run Code Online (Sandbox Code Playgroud)
但它返回太多行,特别是b中没有匹配的行.我试过了
SELECT ...
FROM main ...
...
LEFT JOIN (
SELECT a.col1, a.col2
FROM a
JOIN b ON (a.col3 = b.col3)) ON (a.col2 = main.col2)
Run Code Online (Sandbox Code Playgroud)
这给了我正确的结果但不幸的是"EXPLAIN PLAN"告诉我这样做最终会强制对a和b进行全表扫描,这使得事情变得非常缓慢.我的一个同事在b上建议了另一个LEFT JOIN,但这不起作用,因为它在它出现时给了我b行,但是没有停止从b中没有匹配的行返回行.
有没有办法把main.col2条件放在子SELECT中,这将摆脱全表扫描?或者其他一些方式来做我想要的事情?
SELECT ...
FROM ....
LEFT JOIN ( a INNER JOIN b ON .... ) ON ....
Run Code Online (Sandbox Code Playgroud)