小编典典

限制左联接

sql

我有一个表,我们称它为“ a”,它在涉及许多表的视图中用在左联接中。但是,我只想返回“ a”的行(如果它们也与另一个表“ b”联接)。所以现有的代码看起来像

SELECT ....
FROM main ...
...
LEFT JOIN a ON (main.col2 = a.col2)

但它返回的行太多,尤其是其中a在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)

这给了我正确的结果,但是不幸的是,“ EXPLAIN
PLAN”告诉我们,这样做会导致强制对a和b进行全表扫描,这使事情变得很慢。我的一位同事在b上建议了另一个LEFT
JOIN,但这是行不通的,因为它在出现b时给了我b行,但并没有停止从b中没有匹配项的a行返回。

有什么方法可以将main.col2条件放入子SELECT中,从而摆脱全表扫描吗?或采取其他方式来做我想做的事?


阅读 182

收藏
2021-03-23

共1个答案

小编典典

SELECT …
FROM ....
LEFT JOIN ( a INNER JOIN b ON .... ) ON ....

2021-03-23