web-dev-qa-db-ja.com

INNER JOINの前のWHERE句

私が持っている場合

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

WHERE句は、2つのテーブルがJOINEDの後に実行されますか?

JOINの前に実行されるようにするにはどうすればよいですか?

28
user1124535

WHEREを別のJOIN条件に変更する

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

26
hkf

where句はjoinの前に実行され、不要なレコードを結合しないようにします。だからあなたのコードはそれがそうである方法で結構です。

83
Mosty Mostacho

左結合での私の経験では、定義上、すべてのt1レコードが含まれるため、ONステートメントの「左」(t1)テーブルのレコードを除外することはできません。 whereステートメントは、後で結合の結果に適用されるため、機能します。

私はあなたが何を達成したいのか正確にはわかりませんが、おそらく内部結合もあなたのニーズに合い、それからあなたはcan t1.user = 'bob'条件をONステートメントに追加します。

しかし、Mosty Mostachoが正しい場合、条件の場所(WHERE対ON)は実行速度に関係ありません。

2
tihe

正しい結合が解決策でした:

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

まだ完全な厳密さを通過していませんが、機能しているようです。

0
user2782001

使用できるのは、次のようなFROMの後のテーブル式です。

SELECT *
FROM (SELECT
        id
    FROM Table1
    WHERE user = 'bob') AS t1
LEFT JOIN Table2 t2
    ON t1.id = t2.id
0
Georgi Mirchev

できるよ

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

他の条件の前にt1.user='bob'条件をON句に追加するだけで、最初に評価されます。

SELECT * FROM Table1 t1 
LEFT JOIN Table2 t2
ON t1.user='bob' AND t1.id = t2.id;
0
Ivan Olshansky