2017-03-03 11 views
0

から必要な最新の情報私は、次の列SQL Serverの - 製品および履歴テーブル

ProductId - INT - PK 
Name - Varchar 
Price Decimal 

Productsテーブルを持っている製品の価格が更新されると、私はトリガを使用して、別のテーブルにProductPriceHistory

を持って、Iそのテーブルに古い値段と新しい値段を格納する。このテーブルには、列

ProductPriceHistoryId 
Name 
OldPrice 
NewPrice 
UpdateDate 

私はName列に基づいて、このテーブルに参加することができますが、次ました。私はProduct.Nameを取得したい、Product.Priceと(表ProductPriceHistoryの最後の更新された値を取得するための)ProductPriceHistory.NewPrice -

今の質問は、私の結果セットで、です。

挑戦は、歴史の表では、私は各製品に異なる日付に基づいてたくさんの行を持っています。製品ごとに、この製品用に保管されている最新の行から情報を取得する必要があります。

答えて

0

一意であるため、ProductIdを履歴テーブルに格納し、その値でテーブルを結合する必要があります。

次に、日付の降順、制限1(または、上位から1つのフィールドを選択...)でクエリを並べ替えます。それはあなたに最新の更新のみを与えるでしょう。

編集:テーブル構造が正規化されていません。

Products: 
ProductId 
Name 
Description 

Prices: 
ProductId 
Price 
UpdateDate 

次に、あなたのクエリは次のようになります:それを行うの

SELECT TOP 1 Products.ProductId, Products.Name, Prices.Price, Prices.UpdateDate FROM etc 
+0

クエリが返す行のnubmerを制限するのは標準SQLではありません。その有効性はdbmsによって異なります。 –

+0

「トップを選択...」を含むように編集されました – Stuart

0

標準SQLの方法は、それ自体の凝集との歴史的なテーブルに参加して、あなたのテーブルがあることが私にはより多くの意味になるだろう製品ごとに最大の日付を取ることができます。

select t1.Name, t1.Price, t2.NewPrice 
from Products t1 
join ProductPriceHistory t2 
on  t1.Name = t2.name 
join (
      select Name, max(UpdateDate) as MaxDate 
      from ProductPriceHistory 
      group by Name 
     ) t3 
on  t2.Name = t3.Name and t2.UpdateDate = t3.MaxDate 
関連する問題