2012-05-10 8 views
0

私の簡略化されたクエリは次のようになります。
外部結合の条件は?

SELECT p.product_Id, 
     p.productName, 
     s.LastSales_date 
FROM products as p 
      LEFT OUTER JOIN 
( SELECT product_id , 
      max(Sales_date) as LastSales_date 
      FROM Sales group by product_id) as s 
on s.product_id=p.product_Id 
where 
    (s.LastSales_date is null or -- is it right? 
    s.LastSales_date between '2012/01/01' and '2012/01/05') 

結果:

ProductName  LastSalesDate 
    p_A    2012/01/01 
    p_C    2012/01/01 
    p_E    2012/01/02 

が、行は逃した上であり、その行SALES_DATEせずに、そう、どのような結果を得るために:

ProductName  LastSalesDate 
    p_A    2012/01/01 
    p_b    <null> 
    p_C    2012/01/01 
    p_E    2012/01/02 

私の問題(null)の行は表示されません 私はどんな試みがありがたいです: - )

+3

をあなたの現在のクエリと間違っている何?結果は**データ**はあなたの上にあるもの?あなた入手できますか何テーブル? – Lamak

+0

nullが表示されません。 – Salahaldin

+0

'Sales_date'カラムはどのデータ型ですか? –

答えて

2

それを外部結合での作業それ以外の1は、内側が有効に参加生じ、自身への参加から外側データをフィルタリングするために覚えておくことが重要です。あなたが持って使用して、自分自身を集約フィルタリングかもしれない。この場合において

SELECT p.product_Id, 
     p.productName, 
     s.LastSales_date 
FROM products as p 
LEFT OUTER JOIN 
(
    SELECT product_id , 
      max(Sales_date) as LastSales_date 
    FROM Sales 
    group by product_id 
) as s 
on s.product_id = p.product_Id 
-- Filter s here 
and s.LastSales_date between '2012/01/01' and '2012/01/05' 

SELECT p.product_Id, 
     p.productName, 
     s.LastSales_date 
FROM products as p 
LEFT OUTER JOIN 
(
    SELECT product_id , 
      max(Sales_date) as LastSales_date 
    FROM Sales 
    group by product_id 
-- Filter max(Sales_date) here 
    having max(Sales_date) between '2012/01/01' and '2012/01/05' 
) as s 
on s.product_id = p.product_Id 
+0

製品の売上データがない場合は、結果にnullが含まれている必要があります。 – Salahaldin

+0

@salahaldinそうです。試しましたか? –

+0

素晴らしいおかげで、私は私のクエリを変更し、それはあなたの答えも..動作します。 – Salahaldin

1

あなたが言及した結果が期待できますが、それが機能していないとわかっている場合は、COALESCEの使用をお勧めします。

多分...

SELECT 
p.product_Id 
, p.productName 
, COALESCE(s.LastSales_date,'') 
FROM 
products p 
LEFT OUTER JOIN 
    (SELECT 
     product_id 
     , MAX(Sales_date) AS LastSales_date 
    FROM 
     Sales 
    GROUP BY 
     product_id 
    ) s on s.product_id = p.product_Id 
WHERE 
COALESCE(s.LastSales_date,'') = '' 
OR 
COALESCE(s.LastSales_date,'') BETWEEN '2012/01/01' and '2012/01/05'