2012-01-04 10 views
1

個々のアイテムの履歴の最新を取得し、それを1つの行に返すビューを作成しようとしています。このクエリは正常に動作し、私が欲しいものを正確に返しますが、私はビューに変換しようとすると、それは私がサブクエリを使用せませんビュー内の最新のテーブルを取得する

SELECT item_pk.Id Id, item_name.Value Name 
FROM item_pk 
JOIN 
(
    SELECT * FROM item_name 
    ORDER BY Occurred DESC 
) item_name ON item_name.Id = item_pk.Id 
GROUP BY item_pk.Id 

:ように私は実行したいクエリが見えます。私が試してみると:

CREATE VIEW item_name_latest AS SELECT * FROM item_name ORDER BY Occurred DESC; 
CREATE VIEW item AS SELECT item_pk.Id Id, item_name.value Name 
FROM item_pk 
JOIN item_name_latest item_name ON item_name.Id = item_pk.Id 
GROUP BY item_pk.Id 

itemビューが間違った結果になります。私が得た結果は、修正された注文を生成する中間のビューを使わずに直接item_nameに参加した場合とまったく同じです。つまり、1つのアイテムにつき最新の行をitem_nameから受け取るのではなく、最も古いものを受け取っています。 SELECTステートメントを(ビューではなく)直接呼び出すと、間違った結果が生成されます。

は、私は、次のデータを持っていると言う:

Id | Value  | Occurred 
1 Bob   1325697408000 
1 Bobbie   1325697536000 
2 Stuff   1325697822000 
2 More Stuff  1325697823000 
2 Latest Stuff 1325697824000 
1 Roberta  1325697945000 

期待された結果(所与のクエリとサブクエリの実際の結果)である:

1 Roberta 
2 Latest Stuff 

の実績ビューは次のとおりです。

1 Bob 
2 Stuff 

ビューで期待値を生成する方法はありますか、より良い方法があります。値を取得する?

答えて

1

あなたは、これはあなたのビューを作成したい:

create view item_latest as 
select 
    id, 
    max(occurred) as latestoccurred 
from 
    item_name 
group by 
    id; 

create view item as 
select 
    i1.id, 
    i1.value 
from 
    item_name i1 
    inner join item_latest i2 on 
     i1.id = i2.id 
     and i1.occurred = i2.latestoccurred; 

それはそのidのための最大のoccurred値のoccurred値を持つアイテムのみをつかみます。

+0

正しい方向に私を指摘しました。私はこれらの履歴カラムのいくつかを単一のビューに結合する必要があったので、 'Item'を' Item_Name_Value'に名前を変更し、 'Item'テーブルに' JOIN'しました。ありがとう! –

関連する問題