40

如果我有

SELECT * FROM Table1 t1 
LEFT JOIN Table2 t2 ON t1.id = t2.id 
WHERE t1.user='bob';

该子句是否WHERE在两个表之后运行JOINED

如何使它在 JOIN 之前运行?

4

7 回答 7

111

where子句将在 the 之前执行,join这样它就不会加入不必要的记录。所以你的代码很好。

于 2012-04-12T23:50:19.070 回答
30

更改WHERE为另一个JOIN条件

LEFT JOIN Table2 t2 on t1.id = t2.id AND t1.user='bob'

于 2012-04-12T23:41:52.840 回答
2

根据我在左连接的经验,您不能在 ON 语句中排除“左”(t1)表中的记录,因为 - 根据定义 - 所有 t1 记录都将被包括在内。where 语句确实有效,因为它将在之后应用于连接的结果。

我不完全知道您想要实现什么,但很可能内部连接也适合您的需求,然后您可以将 t1.user='bob' 条件添加到 ON 语句中。

但是,如果 Mosty Mostacho 是正确的,则条件的位置(WHERE 与 ON)与执行速度无关。

于 2012-09-27T17:00:22.513 回答
1

您应该在其他条件之前将t1.user='bob'条件添加到ON子句,它将首先被评估:

SELECT * FROM Table1 t1 
LEFT JOIN Table2 t2
ON t1.user='bob' AND t1.id = t2.id;
于 2019-01-14T08:05:56.410 回答
1

您可以使用 FROM 之后的表表达式,如下所示:

SELECT *
FROM (SELECT
        id
    FROM Table1
    WHERE user = 'bob') AS t1
LEFT JOIN Table2 t2
    ON t1.id = t2.id
于 2019-04-19T10:14:12.813 回答
0

你可以做

SELECT * 
    FROM Table1 t1 
    LEFT JOIN Table2 t2
        ON t1.id=t2.id AND t1.user='bob';
于 2012-04-12T23:42:32.407 回答
0

RIGHT JOIN 是解决方案:

SELECT cars.manufacturer, cars.year FROM cars 
RIGHT JOIN (SELECT m.manufacturer FROM cars AS m ORDER BY m.year DESC LIMIT 3) subq 
ON cars.manufacturer=subq.manufacturer

还没有经过严格的考验,但似乎有效。

于 2014-03-08T02:59:26.113 回答