0

私は mySQL を初めて使用し、製品の価格がスキャンされたすべての店舗とスキャンされていない店舗を一覧表示するクエリを作成するのに苦労しています。以下は、単一の製品の正しい結果を示します。

select distinct(s.id) as store_id, s.chainID as chain_id, p1.productID as product_id, 
s.chain, s.location, s.city, prd.brand, prd.product, prd.quantity, prd.size, prd.unit
from analytics.price p1        -- Fact table with prices
join analytics.pricetime pt   -- Dimension table with time a price was scanned
on p1.priceTimeID = pt.id
join analytics.product prd    -- Dimension table with products
on p1.productID = prd.id
and prd.published = 1
right join analytics.store s   -- Dimension table with stores and the chain they belong to
on p1.storeID = s.id
and p1.chainID = s.chainID
and p1.productID = 46720
and p1.priceTimeID between 2252 and 2265
where s.published=1
and s.chainID = 5;

p1.productID = 46720句を削除してすべての製品の結果を取得すると、価格をスキャンしたすべての店舗 (正しい) が取得されますが、右側の結合の価格なし側には、価格がスキャンされていない店舗のみが表示されます。任意の製品。(これは、価格の事実と、製品、時間、店舗の次元を持つ単純なスター スキーマです)。助けていただければ幸いです。「in」、「not exists」、およびカーソルを使用したスト​​アド プロシージャなど、考えられるあらゆる方法でこれを試しましたが、どの方法でもレンガの壁にぶつかるようです。

明確にするために編集:

これが私が達成しようとしていることです:

Price table
Product Chain       Store       Price
100     5       1       $10
101     5       2       $20

Store table
Chain   Store
5       1
5       2
5       3

Desired Result
Product Chain   Store       Price
100     5       1       $10
100     5       2       NULL
100     5       3       NULL
101     5       1       NULL
101     5       2       $20
101     5       3       NULL


Actual Result
Product Chain   Store       Price
100     5       1       $10
101     5       2       $20
NULL    5       3       NULL
4

1 に答える 1

0

私は a を使用した読みやすさを好みますLEFT JOIN-- これにより、chainid 5 で公開されているすべてのストアと、関連する製品が返されます (基準が与えられます)。

select distinct s.id as store_id, s.chainID as chain_id, s.chain, s.location, s.city, 
    prd.id as product_id, prd.brand, prd.product, prd.quantity, prd.size, prd.unit
from analytics.store s   
    left join analytics.price p1        
        on p1.storeID = s.id
            and p1.chainID = s.chainID
            and p1.priceTimeID between 2252 and 2265
    left join analytics.product prd    
        on p1.productID = prd.id
            and prd.published = 1
    left join analytics.pricetime pt   
        on p1.priceTimeID = pt.id
where s.published=1
    and s.chainID=5;

編集 -- コメントをお願いします。デカルト積を探しているようです:

SELECT P.Product, P.Chain, S.Store, IF(P.Store=S.Store,P.Price,NULL) Price
FROM Price P, Store S
WHERE P.Chain = 5
  AND S.Chain = P.Chain
ORDER BY P.Product, S.Store

SQL フィドルのデモ

于 2013-03-30T01:01:28.163 に答える