2016-05-25 12 views
1

書き込みしようとしているクエリに問題があります。残念ながら私はデータベースに対してのみ照会でき、スキーマを変更することはできません。SQLネストされた内部結合?または内部結合の句

Table 1 
itemID   sale date 
---------------------------- 
1     1/2015 
1     3/2016 
2     5/2016 
2     1/2015 

Table 2 
itemID   colorID   price 
-------------------------------------- 
1     1    23 
1     2    10 
1     3    13 
2     1    11 
2     2    14 
2     3    18 

Table 3 
ColorID  color 
--------------------------------------- 
1    Red 
2    Blue 
3    Green 

Table 4 
SaleBegin  SaleEnd  ColorID 
---------------------------------------- 
1/1/2014  12/31/2014  1 
1/1/2015  12/31/2015  2 
1/1/2016  12/31/2016  3 

ここで、最初の表の両方の商品IDの価格と色を基本的に求めるクエリが必要です。私はこのスキーマを使ってそれをどうやって行うのか分かりません。私は次のようなものを試しました:

SELECT item_id, price, color FROM Table1 T1 

INNER JOIN Table2 T2 
ON T1.ItemID=T2.ItemID 

INNER JOIN Table3 T3 
ON T2.ColorID=T3.ColorID 

INNER JOIN Table4 T4 
ON T3.ColorID=T4.ColorID 

WHERE T1.itemID between SaleBegin AND SaleEnd 

しかし、それは私のために働いていない代わりに、各アイテムの可能なすべての色と価格を教えてください。私は間違って何をしていますか?これらの値を取得するにはどうすればよいですか?期待される結果は次のようになります。

itemID  color  price 
------------------------------------ 
    1   Blue  10 
    1   Green  13 
    2   Green  18 
    2   Blue  14 
+1

これは 'WHERE T1.SaleDateの間ですべきではないですSaleBeginとSaleEnd'? – dnoeth

+0

あなたは各販売の間に各商品の価格と色を探していますか? – supergrady

答えて

0

http://sqlfiddle.com/#!9/e6fac/4

SELECT t1.itemID 
    , t3.color 
    , t2.price 
    FROM table_1 t1 
    LEFT JOIN table_2 t2 
    ON t1.itemID = t2.itemID 
    LEFT JOIN table_3 t3 
    ON t2.colorID = t3.colorID 
    LEFT JOIN table_4 t4 
    ON t3.colorID = t4.colorID 
    WHERE t1.sale_date BETWEEN saleBegin and saleEnd; 
+0

こんにちはOlli、答えてくれてありがとう!私は問題に遭遇している。 itemIDにnull値がある場合(販売されたものを知っているが、何が分かっているのか、売り切れの日付が残っている)、それは返されません。すべてのヌル値でも、それをどのように戻すことができますか? – Mike

0

私は、これはあなたが探しているものであるわからないんだけど、このクエリは、各製品のためにあなたにITEMID、色や価格を与えます各販売時にここで

SELECT 
    t4.SaleBegin 
    ,t4.SaleEnd 
    ,t1.itemID 
    ,t3.color 
    ,t2.price 
FROM Table4 t4 
INNER JOIN Table1 t1 
    ON t4.SaleBegin = CAST(REPLACE(t1.[sale date], '/', '/1/') AS DATE) 
INNER JOIN Table2 t2 
    ON t1.itemID = t2.itemID 
    AND t4.ColorID = t2.ColorID 
INNER JOIN Table3 t3 
    ON t4.ColorID = t3.colorID 

SQL Fiddle

関連する問題