4

WHERE 句の使用と、内部結合の ON でのマッチングの使用に違いがあるかどうかを知りたいです。

この場合の結果は同じです。

最初のクエリ:

with Catmin as 
(
    select categoryid, MIN(unitprice) as mn
    from production.Products
    group by categoryid
) 
select p.productname, mn
from Catmin 
inner join Production.Products p
on p.categoryid = Catmin.categoryid
and p.unitprice = Catmin.mn;

2 番目のクエリ:

with Catmin as 
(
    select categoryid, MIN(unitprice) as mn
    from production.Products
    group by categoryid
) 
select p.productname, mn
from Catmin 
inner join Production.Products p
on p.categoryid = Catmin.categoryid
where p.unitprice = Catmin.mn;          // this is changed

両方のクエリの結果:

結果

4

3 に答える 3

6

私の答えは少しトピックから外れているかもしれませんが、INNER JOIN を OUTER JOIN に変えるときに発生する可能性がある問題を強調したいと思います。

この場合、ON 句または WHERE 句に述語 (テスト条件) を配置することの最も重要な違いは、省略されるテーブルのフィールドを配置すると、気付かずに LEFT または RIGHT OUTER JOINS を INNER JOINS に変換できることです。 WHERE 句。

たとえば、テーブル A と B の間の LEFT JOIN で、WHERE 句に B のフィールドを含む条件を含めると、結果セットで B から返される null 行がなくなる可能性が高くなります。効果的かつ暗示的に、LEFT JOIN を INNER JOIN に変更しました。

一方、ON 句に同じテストを含めると、引き続き null 行が返されます。

たとえば、次のクエリを使用します。

SELECT * FROM A 
LEFT JOIN B
   ON A.ID=B.ID

クエリは、B のいずれとも一致しない A からの行も返します。

次の 2 番目のクエリを使用します。

SELECT * FROM A 
LEFT JOIN B
WHERE A.ID=B.ID

この 2 番目のクエリは、LEFT JOIN を指定したために B に一致しないと考えていても、A から B に一致しない行を返しません。これは、テスト A.ID=B.ID によって、結果セットから B.ID がヌルの行が除外されるためです。

そのため、WHERE 句ではなく ON 句に述語を入れることを好みます。

于 2013-10-03T13:30:27.430 に答える
5

結果はまったく同じです。クエリのパフォーマンスが向上するため、「ON」句を使用することをお勧めします。

テーブルからデータを要求してからフィルター処理する代わりに、on 句を使用して、最初にデータセットをフィルター処理してから、データを他のテーブルに結合します。したがって、一致するデータが少なくなり、結果が速くなります。

于 2013-10-03T08:28:21.500 に答える