1

私はadventureworks2012を使用しています:

最初のクエリは 43 行を返し、null はありませんが、2 番目のクエリは 19,000 を超える多くの null を返します。

条件が満たされていない場合でも、外部結合がクエリの左側から行を返すと思ったので、2 つのクエリは同等である必要がありますか?

--1

SELECT c.CustomerID, s.SalesOrderID, s.OrderDate
FROM Sales.Customer AS c
LEFT OUTER JOIN Sales.SalesOrderHeader AS s ON c.CustomerID = s.CustomerID
WHERE s.OrderDate = '2005/07/01';

--2

WITH orders AS (
SELECT SalesOrderID, CustomerID, OrderDate
FROM Sales.SalesOrderHeader
WHERE OrderDate = '2005/07/01'
)
SELECT c.CustomerID, orders.SalesOrderID, orders.OrderDate
FROM Sales.Customer AS c
LEFT OUTER JOIN orders ON c.CustomerID = orders.CustomerID
ORDER BY orders.OrderDate DESC;
4

2 に答える 2

2

WHEREクエリ 1 の句が原因です。このWHERE句は、結合されている 2 つのテーブルの最終結果をフィルター処理します。条件を fromWHERE句に移動する必要があります。これは、別のテーブル ( )結合する前に、最初にレコード ( テーブル )ONフィルタリングしSales.SalesOrderHeaderSales.Customerます。ここでも見つけることができます。

SELECT c.CustomerID, s.SalesOrderID, s.OrderDate
FROM   Sales.Customer AS c
       LEFT OUTER JOIN Sales.SalesOrderHeader AS s 
           ON c.CustomerID = s.CustomerID  AND 
              s.OrderDate = '2005/07/01';
于 2013-09-23T17:31:32.100 に答える