1

顧客テーブルと詳細テーブルがあります。

テーブル内のすべての顧客のレコードを取得し、該当する顧客に関する最新の詳細データを表示したいと考えています。

現在、where句は顧客を除外しています。

where 句を左外部結合に移動しようとしましたが、目的の結果を得ることができませんでした。

クエリを実行しても、製品がまったくフィルタリングされていないようです。

SELECT
    cust.Customer
  , cust.Company
  , inv.Date
  , inv.Product
  , inv.Units
  , inv.Extended 
FROM
  customerlist cust
LEFT OUTER JOIN 
  detail inv 
ON 
  cust.customer = inv.customer
LEFT OUTER JOIN 
  detail inv2 
ON 
      inv.customer = inv2.customer 
  AND (
          inv.date < inv2.date 
       OR inv.date = inv2.date AND inv.customer < inv2.customer
      )
WHERE 
      (
          inv.Product = 'CC' 
       OR inv.Product = 'CG' 
       OR inv.Product = 'CH'
      ) 
  AND inv2.customer IS NULL

私の質問は似ています

SQL 結合: 1 対多の関係で最後のレコードを選択する

私は同じことをしようとしていますが、すべての顧客を含めて製品でフィルタリングしたいだけです。

アップデート

サンプルデータ

これが私の元のクエリです。顧客がいないことを除けば、これは素晴らしいことです。

これが私の元のクエリです

where句を削除して、次のように左結合に挿入すると

LEFT OUTER JOIN 
  detail inv2 
ON 
      inv.customer = inv2.customer 
  AND (
           inv.date < inv2.date 
       OR  inv.date = inv2.date AND inv.customer < inv2.customer
      ) 
  AND (    
           inv.Product = 'CC' 
       OR  inv.Product = 'CHECK' 
       OR  inv.Product = 'ACH'
      )

これが結果です。「CC」などではない製品列が表示されています。そして、顧客が重複しています。

ここに画像の説明を入力

4

2 に答える 2

3

ほぼ正解です。

ON最初のクエリでは、最初の の条件で製品フィルターを指定しなかったため、指定された製品の詳細を持っていないすべての顧客が削除されますOUTER JOIN

SELECT
    cust.Customer
  , cust.Company
  , inv.Date
  , inv.Product
  , inv.Units
  , inv.Extended 
FROM
  customerlist cust
LEFT OUTER JOIN 
  detail inv 
ON 
      cust.customer = inv.customer
  AND inv.Product IN ('CC', 'CG', 'CH')
LEFT OUTER JOIN 
  detail inv2 
ON 
      inv.customer = inv2.customer 
  AND (
          inv.date < inv2.date 
       OR inv.date = inv2.date AND inv.customer < inv2.customer
      )
WHERE 
  inv2.customer IS NULL

それはそれを行う必要があります。

もう一つ、正しくないと思う点があります。そのAND inv.customer < inv2.customer部分はおそらくあるはずです(テーブルAND inv.id < inv2.idにidフィールドがある場合)。detail

これは、条件が同じ日付を持つレコードを主キーORでフィルタリングしているためです。detail

アップデート

問題のテーブルには主キー フィールドがないため、ROWIDADS 機能を使用して解決できます。

SELECT
    cust.Customer
  , cust.Company
  , inv.Date
  , inv.Product
  , inv.Units
  , inv.Extended 
FROM
  customerlist cust
LEFT OUTER JOIN 
  detail inv 
ON 
      cust.customer = inv.customer
  AND inv.Product IN ('CC', 'CG', 'CH')
LEFT OUTER JOIN 
  detail inv2 
ON 
      inv.customer = inv2.customer 
  AND (
          inv.date < inv2.date 
       OR inv.date = inv2.date AND inv.ROWID < inv2.ROWID
      )
WHERE 
  inv2.customer IS NULL
于 2013-06-13T09:46:40.550 に答える